Linux编译链接选项静态库--whole-archive,--no-whole-archive

这篇具有很好参考价值的文章主要介绍了Linux编译链接选项静态库--whole-archive,--no-whole-archive。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

在使用cmake构建工程时,目标可执行程序可以正常构建,但是运行不符合预期。可执行程序依赖libtool.a静态库,静态库有个全局map,map中存放注册的回调函数。在可执行程序运行时发现map为空,检查代码逻辑,libtool.a中存在注册行为。

定位思路

1、通过nm定位出相关符号表在libtool.a中存在,但是在最终可执行程序中不存在。
2、不采用静态库编译方式,可执行程序中存在相关符号表,由此确认时编译或者链接存在问题。
3、最后排查出是由于–whole-archive链接选项没有加,默认情况下代码中未被调用的符号,因此最终生成的可执行文件中,这些符号被自动优化掉。

静态库链接选项

–whole-archive可以把在其后面出现的静态库包含的函数和变量输出到动态库(可执行程序中)。在代码中定义的符号(如函数名)还未使用到之前,链接器并不会把它加入到连接表中。
"–whole-archive,–no-whole-archive"这是链接器的选项,所以在编译的时候要用-Wl,[options]来传递给链接器,不然编译器会不认得这个选项。

//a.cpp:
void func(){
    printf("I am in a.cpp.\n");
}

//main.cpp:
extern void func();

int main()
{
    func(); 
    printf("I am in main.cpp"); 
    return 0;
}

首先编译g++ -c a.cpp,再打包ar -r libtool.a a.o

如果这么链接g++ -L. -ltool main.cpp -o main,则链接器会报错,称func()未定义。其实改一下顺序既可以解决g++ main.cpp -L. -ltool -o main

或者使用g++ -Wl,--whole-archive -L. -ltool -Wl,--no-whole-archive main.cpp -o main,将libtool.a中的所有.o中的符号都链接进来。

对于C++中使用的Register机制,即动态对象创建会遇到这样的问题。

在cmake中添加链接选项

TARGET_LINK_LIBRARIES(app
-Wl,--whole-archive
tool
-Wl,--no-whole-archive
)

参考

http://stackoverflow.com/questions/805555/ld-linker-question-the-whole-archive-option文章来源地址https://www.toymoban.com/news/detail-730228.html

到了这里,关于Linux编译链接选项静态库--whole-archive,--no-whole-archive的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 静态链接——编译和链接

    将所有的“define”删除,并且展开所有的宏定义。 处理所有条件预编译指令,比如“#if”、“#ifdef\\\'”、“#elif”、“#else”、“#endif\\\'”。 处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。注意,这个过程是递归进行的,也就是说被包含的文件可能还包

    2024年02月12日
    浏览(28)
  • 【C/C++编译】CMake定义头文件路径、链接库路径及链接选项:PRIVATE,INTERFACE,PUBLIC

    在 CMake 中, 有许多常见的变量可用于配置和管理构建过程 。以下是一些常见的变量,包括当前源码路径: CMAKE_SOURCE_DIR : 当前 CMakeLists.txt 所在的源码目录的根路径 。 CMAKE_BINARY_DIR :构建目录的根路径,即 构建生成的可执行文件、库和其他构建输出的存放位置 。 CMAKE_CUR

    2024年02月11日
    浏览(37)
  • QT 链接动态库 (静态链接 条件编译 动态加载)

    本篇文章以我实际使用过程为例,在此总结一下qt链接动态库的几种方式 使用的动态库为libzint.so,库目录为/usr/local/lib 第一种为直接将库添加到QT中,可以看成静态库 通过pro文件添加链接 在用到外部库的程序代码中直接 这样就可以直接调用外部库的中结构体与函数接口 可以

    2024年01月20日
    浏览(40)
  • Opencv静态库,编译和调用静态库,静态库链接另一个静态库

    静态库相比动态库更加独立,在生成和部署应用到相关设备的时候避免找不到动态库 Windows下静态库 lib后缀,动态库dll linux下静态库a后缀,动态库so 首先安装依赖库 以opencv4.5为例 下载地址,下载 source 源码 解压后目录如下 进入源码 完成后,在build目录下会生成install文件夹

    2024年02月07日
    浏览(32)
  • RT-Thread开发,使用SCons编译,生成静态库,并进行链接生成MCU程序

            SCons 是一个开放源代码、以 Python 语言编写的下一代的程序建造工具。它最初的名字是 ScCons, 基于由 perl 语言编写的 Cons 软件开发而成,它在 2000 年 8 月获得了由 Software Carpentry 举办的 SC 建造比赛的大奖。现在 ScCons 已经被改名为 SCons,目的是为了表示不再与 Sof

    2024年02月11日
    浏览(36)
  • 【Linux】软硬链接 / 动静态库

    硬链接(hard link) 可以将它理解为原始文件的别名, 和原始文件使用相同的 inode 编号和 data block.(inode 是文件在该磁盘分区内的唯一标识, 记录着文件的属性等内容; data block 是文件的内容) 可以使用 ln 指令为文件创建一个硬链接. 当创建一个新的硬链接时, 该文件的硬链接数就会

    2024年04月08日
    浏览(34)
  • 【看表情包学Linux】软硬链接 | 软连接数 | 创建软硬链接 | 动静态库 | 生成静态库 | 生成动态库

       🤣  爆笑 教程  👉 《看表情包学Linux》👈   猛戳订阅     🔥 💭 写在前面: 上一章我们讲解了 inode,为文件系统收了尾,这几章我们充分地讲解完了文件系统的知识点,现在我们开始开始学习软硬链接了。如果没有文件系统的铺垫,想直接理解软硬链接难免有些困

    2024年02月14日
    浏览(31)
  • 【Linux】软硬链接与动静态库

    相关文章: 【Linux】动静态库以及动静态链接 【Linux】基础IO_文件系统 我们知道,每一个文件都会有自己的inode编号,我们可以通过如下指令来查看:  我们发现, 每一个不同文件的inode编号都不相同,所以inode可以说是用来标识文件的标识符 。接下来,我们通过下面指令来

    2024年02月10日
    浏览(40)
  • 【Linux】软硬链接和动静态库

    **软链接:**是一个独立文件,有自己独立的 inode 和 inode 编号。 **硬链接:**不是一个独立的文件,它和目标文件使用的是同一个 inode。硬链接就是单纯的在 Linux 指定的目录下,给指定的文件新增 文件名 和 inode 编号的映射关系! 我们可以通过如下命令,创建一个文件的软硬

    2024年02月05日
    浏览(25)
  • Linux软硬链接和动静态库

    本文已收录至《Linux知识与编程》专栏! 作者:ARMCSKGT 演示环境:CentOS 7 当我们安装一款软件成功后,桌面会多一个图标,如果我们点击图标就能启动软件,但那个图标就是软件本身吗?显然不是!图标只是软件启动程序的一个快捷方式,在Linux中可以通过软硬链接来创建类

    2024年02月08日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包