我在链接可执行文件中遗漏了静态库符号的问题.这是我的问题的描述:
我有几个目标文件构建的静态库.这些目标文件提供了一系列符号,与以下内容相关联:
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下
使用-rdynamic -Wl,-whole-archive <all your libs> -Wl,-no-whole-archive <boost, pthread and so on>- 你的一个lib不在--whole-archive