最近一直在琢磨怎么在linux下装开源库,像openCV,ffmpeg等等!这么好的开源库,想基于这些做些开发,可是当我们使用的时候就出现了各种问题。编译时什么头文件没包含进来,什么库没找到啦!等等,这些问题让你觉得很苦恼,也是阻止你前进的障碍。我花了好久才把这些库文件装起来。下面开始讲讲我的经验吧,以后不管什么库就可以装了。
要想会装任何库,就必须懂得原理!
库有标准库和飞标准库。标准库就是收集所有符合标准的头文件以及常用的函数程序组成的一个文件库。像c/c++标准库,你用这些库文件编程时你不用管怎么编译链接的,你只要敲上gcc ***.C -O ***就行了。gcc会自动实现编译链接然后形成可执行程序。这背后到底是怎么运行的呢?
1,头文件位置
gcc默认会在/usr/include目录下寻找头文件,这是标准库的头文件的路径,但非标准的库一般不会把头文件直接放在该目录下,一般的作法是在该目录下创建一个自己的目录,然后在此目录下直接或分门别类放自己的头文件。如果是这样,gcc编译时是不会找到这些头文件的,我们会看到有“×××: No such file or directory”的出错信息。解决的方法就是用gcc的-I选项列出这些非标准的路径(实际编程当中一般是由pkg-config --cflags 完成这一工作的)。
2,库文件位置
gcc默认会链接标准c语言库,但如果所用的库是“舶来品”,gcc自然不会自动链接,如果也没有显式链接的话,在链接阶段就会出现诸如“: undefined reference to `gtk_container_set_border_width'/tmp/ccvHaxUx.o(.text+0x1af): In function `main':”的错误。 解决的方法就是利用gcc的-l参数显式链接需要链接的库。这样gcc就会按照一种特定的命名规则到默认的目录(/usr/lib和/lib等目录)下去寻找这些库,并自动链接。但如果库放在自己的定义的目录下,gcc还是不能找到的,这种情况下可以用gcc -L来列出非标准库的路径。(实际编程中这一工作是由pkg-config --libs完成的)
举个例子:(自己创建一个库)创建文件hello.c,内容如下:
#include <stdio.h>
void hello(void)
{
printf("Hello World/n");
}
编译生成动态库的命令为:gcc (-fpic) -shared -o libmyfunction.so myfunction.c
-fpic 使输出的对象模块是按照可重定位地址方式生成的。
-shared指定把对应的源文件生成对应的动态链接库文件。
用命令gcc -shared hello.c -o libhello.so编译为动态库。可以看到,当前目录下多了一个文件libhello.so。
[leo@leo test]$ file libhello.so
libhello.so: E