编译程序小结
前段时间看了下cmake,这里以编译opencv3.1为例作一个简单的小结,顺便总结一下编译连接与库的知识,实践所得,没有系统验证。
- 编译、连接与库
编译、连接与库
首先,编译连接的基本概念我事先是有的但是有些问题没有搞清楚。
1.静态链接库和动态连接库的区别
首先库就分动态连接库和静态连接库。比如说在程序里调用了一段第三方库的程序,
假如它是静态连接库的话,那在调用这段程序的时候就会把这段第三方库的程序编译后的部分插入到原先程序的编译后的程序中间,也就是所谓的连接,相当于在原先的程序上增加了一段代码。
假如它是动态连接库的话,则有所不同首先一个问题,动态连接后第三方库是放在其他位置而不是添加在原先的程序中间,而且并不是链接的阶段添加程序而是在运行阶段载入链接,这样带来一个好处是如果多次调用这个程序并不会增加原先程序的代码量。
两者的区别:
静态链接库的优点是在运行阶段不需要额外的动态连接库,缺点是当原先第三方库有修改或者升级的时候必须重新编译
动态链接库的优缺点与静态链接库相对,升级的时候只要重新编译原先的动态链接库,在放回原先的位置就行,或者通过超链接的方式替换原先的链接库名字就行,不需要重新编译整个程序,升级比较容易。
2.linux下连接库的编译
在ubuntu下通常来说很多软件或者库都是apt-get来安装的,如果是从源码编译的换通常来说大概就是简单的几步:
cd <source-dir>
mkdir build & cd build
cmake ..//可以加入编译的可选命令
make //在当前目录编译
make install//把编译后的程序安装,通常默认的位置是/usr下或者/usr/local
通常/usr或者/usr/local有几个相同的文件夹
/bin//一般放可以运行的程序
/include//一般放头文件
/lib//一般放动态链接库。.so等
当然这只是通常来说的情况。也有人把把程序编译后的动态链接库放到自己的主文件夹下,这样通常来说都是类似这样的目录结构
~/local/bin
~/local/include
~/local/lib
这样做有些问题需要说明首先很多这样写程序调用动态链接库里的程序后发现没有办法找到动态连接库,这是因为少做了一步,在/etc/ld.so.conf.d/下添加一个.conf文件,比如说opencv.conf然后再opencv.conf中间添加动态连接库的路径如/home/zhaoch93/local/lib/。保存后在终端运行 sudo ldconfig才行。这个路径下面保存了linux默认的动态链接库的地址,并按照它自己的组织方式保存内容。当然你也可以选择通过ide添加动态连接库。
比如说:
sudo /bin/bash -c ‘echo “/usr/local/lib” > /etc/ld.so.conf.d/opencv.conf’
sudo ldconfig
如果说头文件找不到的话就在ide里面的include路径添加~/local/include目录就好啦。