我遇到链接可执行文件中遗漏的静态库符号问题。 这是我的问题的描述:
我有几个目标文件构建的静态库。这些目标文件提供了与以下相关联的符号组:
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下
答案 0 :(得分:5)
使用-rdynamic -Wl,-whole-archive <all your libs> -Wl,-no-whole-archive <boost, pthread and so on>
- 其中一个库不在--whole-archive