GCC 静态链接库的顺序很重要
链接器是这样工作的:从左向右搜索,如果标记未解决的符号(未定义的类,变量或函数),在后续的库中如果找到该符号的定义, 则把链接该库,引入该符号的定义,如果当前库中的符号定义暂时没有用到(即使后面需要用到)则丢弃。因此如果链接的顺序,不当,会导致符号定义找不到, 编译/链接时会报错“unreference”之类的错误。
静态链接库
静态链接库本身之间也会有相互依赖,因此静态链接库的顺序也需要注意。
常见的一个例子是使用google-test时,需要gtest, pthread连个库,其中gtest是静态库,pthread是动态库,但是gtest依赖于pthread。
所以gcc编译是gtest要放在pthread左边。
假设我们有一个使用google test的程序test.cpp, 则编译命令应该为:
gcc -std=c++11 test.cpp -lgtest -lpthread -o test
gcc -std=c++11 test.cpp -lpthread -lgtest -o test //wrong
gcc -std=c++11 -lgtest -lpthread test.cpp -o test //wrong
动态连接库
动态链接库之间不必考虑顺序, 动态链接库会解决其之间的链接关系。 但是动态库和静态库以及源文件之间的依赖关系要考虑
GCC 有多个链接库时,可以指定特定链接库
假设我们有两个链接库libfoo.so, 分别在/usr/lib和/home/user/lib , 而LD_LIBRARY_PATH=/home/usr/lib(/usr/lib是默认的库查找目录),这是我们编译时使用-lfoo, 则能找到两个同名的库,会冲突。这时可以指定使用哪个库,方法是加上路径,比如上文中google test的例子:
gcc -std=c++11 test.cpp /usr/lib/libgtest.a -/usr/lib/linux/libpthread.so -o test