2011-04-16 104 views
4

我在链接可执行文件中缺少静态库符号时遇到问题。 这里是我的问题描述:链接可执行文件中缺少静态库中的符号

我有从几个目标文件建立的静态库。这些目标文件提供了与下列关联的sevaral组符号:

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

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

库与可执行文件链接。该文件仅使用来自lib的level2符号。但是这个可执行程序在执行期间加载的一些动态库需要level3符号。

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

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

整个项目是用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/???:/ home/beduin/???/build/deb/lib/???:/ usr/local/ssl/lib64

+0

- 整个档案和-rdynamic *是*的方式来解决这个问题 - 你可以显示commandl生成可执行文件的ine? – Erik 2011-04-16 11:30:58

+0

我已经添加了comamndline的问题。 – beduin 2011-04-16 13:13:56

+0

试试'-rdynamic -Wl,-whole-archive <你的所有库> -Wl,-no-whole-archive ' - 看起来像你的一个库不在--whole-档案 – Erik 2011-04-16 13:18:58

回答

4

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

+2

一个建议:解释为什么'-whole-archive'有帮助。与类似Stackexchange的网站相比,提供可用资源的不仅仅是发布问题的人。一般而言,我没有看到许多对所有人都有帮助的单行答案,只是发布原始问题的个人。 – 2012-04-20 19:41:16

+0

是否 - 全部归档转储甚至标记为隐藏的符号?我的可执行文件大小增加了很多。 – Halsafar 2012-07-23 18:53:45