一:gcc/g++的编译参数,这里只介绍 -L 、-l、-include、-I、-shared、-fPIC
-L :表示要链接的库所在的目录。-L. 表示要链接的库在当前目录, -L/usr/lib 表示要连接的库在/usr/lib下。目录在/usr/lib时,系统会自动搜索这个目录,可以不用指明。
-l(L的小写):表示需要链接库的名称,注意不是库文件名称,比如库文件为 libtest.so,那么库名称为test()
-include :包含头文件,这个很少用,因为一般情况下在源码中,都有指定头文件。
-I (i 的大写):指定头文件的所在的目录,可以使用相对路径。
-shared :指定生成动态链接库
-fPIC: 表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时事通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码共享的目的。
-std=c++11,是支持C++11的编辑器
动态链接库路径,系统默认在/usr/lib 和/usr/local/lib两个库目录搜索,自己定义的库需要格外指定路径(设定变量LD_LIABRARY_PATH)或者将其拷贝到这两个目录下,在上面的例子的测试过程,已经有说明。当然也可以将当前路径添加到/etc/ld.so.conf文件中或者/etc/ld.so.conf.d目录下的一个文件中。
调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。
二:如果编译不小心又有错误:
(.text+0x13): undefined reference to `func'
则可以按照以下方式去解决
gcc -c test.c gcc -c main.c
gcc -o main main.o
main.o: In function `main': main.c:(.text+0x7): undefined reference to `test' collect2: ld returned 1 exit status
1
|
gcc -o main main.o
test
.o
|
gcc -o main main.c //缺少test()的实现文件
gcc -o main main.c test.c //ok,没问题了
gcc -c test.c ar -rc test.a test.o
gcc -c main.c
gcc -o main main.o
/tmp/ccCPA13l.o: In function `main': main.c:(.text+0x7): undefined reference to `test' collect2: ld returned 1 exit status
gcc -o main main.o ./test.a //注:./ 是给出了test.a的路径
gcc -o main main.c ./test.a //同样,如果不加test.a也会报错
1
|
gcc -c func.c gcc -c
test
.c gcc -c main.c
|
ar -rc func.a func.o ar -rc test.a test.o
gcc -o main main.o test.a
test.a(test.o): In function `test': test.c:(.text+0x13): undefined reference to `func' collect2: ld returned 1 exit status
gcc -o main main.o test.a func.a
gcc -o main main.o func.a test.a
test.a(test.o): In function `test': test.c:(.text+0x13): undefined reference to `func' collect2: ld returned 1 exit status
gcc -c test.c ar -rc test.a test.o
g++ -o main main.cpp test.a
/tmp/ccJjiCoS.o: In function `main': main.cpp:(.text+0x7): undefined reference to `test()' collect2: ld returned 1 exit status
g++ -o main main.cpp test.a