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

时间:2011-04-16 09:38:54

标签: c++ linker g++

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

我有几个目标文件构建的静态库。这些目标文件提供了与以下相关联的符号组:

  1. 一组C函数和结构(几个目标文件)。让我们调用相应的符号 level1 符号。
  2. 这个C函数和结构的一组C ++包装类(另一个对象文件)。让我们调用相应的符号 level2 符号。
  3. 一组C ++包装类,它们来自具有扩展功能的2级类(另一个目标文件)。让我们调用相应的符号 level3 符号。
  4. Undeground C代码使用其他几个项目和外部库。其中一些是静态的,所以目前这个lib也是静态的。

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

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

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

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

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

    我已经尝试了几种链接选项来解决问题( - export-dynamic, - which_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下

1 个答案:

答案 0 :(得分:5)

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

之内