那些躺过的坑:静态库链接第三方静态库

个人知识库

Author: CSDN博主「码上见真晓」, Date: 2021-04-13 16:50:50 +0800, Categories: , Tags:

那些躺过的坑:静态库链接第三方静态库

本文摘抄自网络,原文链接:https://blog.csdn.net/qq_15623245/article/details/115668217

静态库链接静态库

一、问题: 记一次躺过的坑,一个项目工程中使用了静态库链接第三方静态库的情况,编译失败: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表示将缺省库链接模式恢复成动态链接。


版权声明:本文为CSDN博主「码上见真晓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_15623245/article/details/115668217