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

静态库链接静态库

 

一、问题:

 记一次躺过的坑,一个项目工程中使用了静态库链接第三方静态库的情况,编译失败: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选项使用动态链接,有两种情况:
  1. 动态库在静态库后面连接:gcc test.cpp -L. -Wl,-Bstatic -ltestlib  -Wl,-Bdynamic -ltestdll  

  2. 当动态库在静态库前面连接时,必须在命令行最后使用动态连接的命令才能正常链接:gcc test.cpp -L. -Wl,-Bdynamic -ltestdll -Wl,-Bstatic -ltestlib  -Wl,-Bdynamic,

    最后的-Wl,-Bdynamic表示将缺省库链接模式恢复成动态链接。

 

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值