静态库链接静态库
一、问题:
记一次躺过的坑,一个项目工程中使用了静态库链接第三方静态库的情况,编译失败:Handle.cpp:(.text+0x5a4): undefined reference to `third_party_libraries()'
二、场景示例:
示例代码如下:Handle.cpp Handle.h引用了第三方提供的库, 编译生成静态库libHandle.a
//Handle.h
#ifndef _HANDLE_H_
#define _HANDLE_H_
#include <iostream>
#include <stdio.h>
#include "third_party_libraries.h"
class Handle {
public:
Handle();
};
#endif
//Handle.cpp
#include "Handle.h"
Handle::Handle(){
printf("using Third-party libraries\n");
third_party_libraries();//第三方库方法
}
/*
编译生成静态库libHandle.a:
g++ -I./ -L./ -I./third_party_libraries/include -L./third_party_libraries/lib -c Handle.cpp -lthird_party_libraries
ar rcs libHandle.a Handle.o
*/
示例代码如下:main.cpp , 编译生成执行文件main
//main.cpp
#include <iostream>
#include <stdio.h>
#include "Handle.h"
int main()
{
Handle *m_handle = new Handle();
return 0;
}
编译生成执行文件main
当前目录文件:main.cpp Handle.cpp Handle.h third_party_libraries/
(1)g++ -o main main.cpp -lHandle -lthird_party_libraries //找不到thrid_party_libraries.h
(2)g++ -I./ -L./ -I./third_party_libraries/include -L./third_party_libraries/lib -o main main.cpp -lthird_party_libraries -lHandle //出错:Handle.cpp:(.text+0x5a4): undefined reference to `third_party_libraries()'
(3)g++ -I./ -L./ -I./third_party_libraries/include -L./third_party_libraries/lib -o main main.cpp -lHandle -lthird_party_libraries //成功
三、总结:
- 链接静态库是有先后顺序的,链接了libA.a的libB.a,编译的时必须先-lB 再-lA。
- 项目工程比较复杂、比较大的时候,很容易忽略了链接静态库先后的问题,导致编译库的方法找不到。
- linux默认对库的连接是使用动态库,在找不到动态库的情况下再选择静态库,可用-static 指定使用静态库
- 当静态动态混用时,Wl,-Bstatic告诉链接器使用-Bstatic选项,该选项是告诉链接器,对接下来的-l选项使用静态链接;-Wl,-Bdynamic就是告诉链接器对接下来的-l选项使用动态链接,有两种情况:
-
动态库在静态库后面连接:gcc test.cpp -L. -Wl,-Bstatic -ltestlib -Wl,-Bdynamic -ltestdll
-
当动态库在静态库前面连接时,必须在命令行最后使用动态连接的命令才能正常链接:gcc test.cpp -L. -Wl,-Bdynamic -ltestdll -Wl,-Bstatic -ltestlib -Wl,-Bdynamic,
最后的-Wl,-Bdynamic表示将缺省库链接模式恢复成动态链接。