链接可执行文件中的静态库中缺少符号

bed*_*uin 5 c++ linker g++

我在链接可执行文件中遗漏了静态库符号的问题.这是我的问题的描述:

我有几个目标文件构建的静态库.这些目标文件提供了一系列符号,与以下内容相关联:

  1. 一组C函数和结构(几个目标文件).让我们调用相应的符号 level1符号.
  2. 一组用于此C函数和结构的C++包装类(另一个对象文件).让我们调用相应的符号level2符号.
  3. 一组C++包装类,内置于具有扩展功能的2级类(另一个目标文件).让我们调用相应的符号level3符号.

Undeground C代码使用其他几个项目和外部库.其中一些是静态的,所以目前这个lib也是静态的.

库与可执行文件链接.此文件仅直接使用lib中的level2符号.但是在执行期间由此可执行文件加载的一些动态库需要level3符号.

问题是,由于某种原因,level3符号会被遗漏到此可执行文件中(nm已批准).

库本身包含所有符号组.此外,还有另一个与此库链接的可执行文件,它还包含所有符号组.这些可执行文件之间的主要区别在于第二个可执行文件(其中显示了所有符号)直接使用leve3符号.

整个项目使用CMake在调试配置中构建(这意味着"-g"选项在g ++命令中显示).底层操作系统是GNU/Linux x86_64.g ++版本是4.4.

我已经在StackOverflow上检查了几个类似的问题,但我没有找到任何可接受的解决方案.

我已经尝试了几个链接选项来解决问题( - export-dynamic,--whole_archive),但都没有帮助.

我很高兴看到任何解决这个问题的想法,或者至少是这种奇怪行为的可能原因.

这是用于构建可执行文件的命令行.命令由CMake生成.我只添加--whole_archive选项,然后删除可执行文件并重新运行命令.我也希望你能原谅我用"???"替换所有项目特定名称.

exec_name - 我们正在讨论的可执行文件的名称lib_name - 我们正在讨论
的库的名称

/ usr/bin/c ++ - 符号链接到g ++ v4.4可执行文件

/ usr/bin/c ++ -Wextra -g -fPIC CMakeFiles/exec_dir.dir/main.cpp.o CMakeFiles/exec_dir.dir/options.cpp.o CMakeFiles/exec_dir.dir/runtime.cpp.o CMakeFiles/exec_dir.dir /plugins.cpp.o CMakeFiles/exec_dir.dir/CServer.cpp.o -o exec_name -rdynamic ../lib/???/lib???.a --whole-archive ../../lib/ ???/???/lib_name.a ../lib/???/lib???.so ../../lib/????????lib???.a .. /../????????lib????a ../../lib/???/lib???.a -ldl -lboost_filesystem -lboost_signals -lboost_system -lboost_thread ../. ./lib/???/lib????so /usr/local/ssl/lib64/libcrypto.so -ldl -luuid -lodbc ../lib/log/lib???.so ../lib/ config/lib ??? a -lpthread ../../???????/lib???.a -Wl,-rpath,/ home/beduin/???/build/deb/?? ?/ lib目录/ ???:/家庭/ beduin/??? /编译/ deb的/ lib目录/ ???:在/ usr /本地/ SSL/lib64下

Eri*_*rik 5

使用-rdynamic -Wl,-whole-archive <all your libs> -Wl,-no-whole-archive <boost, pthread and so on>- 你的一个lib不在--whole-archive

  • 一个建议:解释为什么`-whole-archive`有帮助.类似Stackexchange的站点不仅仅是为发布问题的人提供可用资源.一般来说,除了发布原始问题的个人之外,我没有看到许多单行答案对任何人都有帮助. (3认同)