我有一个可执行文件,由几个目标文件构建,并与几个静态和共享库链接.我想为其中一个链接库指定-Wl,-whole-archive链接器选项.
例如,从此命令:
/usr/bin/c++ _objectFiles_ -o _myExec_ _someCommonOptions_ _myLibraries_ -Wl,-rpath _path to libs_
Run Code Online (Sandbox Code Playgroud)
我想得到这个命令:
/usr/bin/c++ _objectFiles_ -o _myExec_ _someCommonOptions_ _allOtherLibs_ \
-Wl,-whole-archive _one particular lib_ -Wl,-no_whole-archive -Wl,-rpath _path to libs_
Run Code Online (Sandbox Code Playgroud)
我能使用cmake实现这一目标吗?据我所知,当我添加类似的东西时
set_target_properties(myExec PROPERTIES LINK_FLAGS "-Wl,-whole-archive")
Run Code Online (Sandbox Code Playgroud)
然后-whole-archive为所有链接库设置选项,这绝对不是我想要的.
谢谢.
我在链接可执行文件中遗漏了静态库符号的问题.这是我的问题的描述:
我有几个目标文件构建的静态库.这些目标文件提供了一系列符号,与以下内容相关联:
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 …