小编bed*_*uin的帖子

在链接可执行文件时仅指定一个静态库的链接标志

我有一个可执行文件,由几个目标文件构建,并与几个静态和共享库链接.我想为其中一个链接库指定-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为所有链接库设置选项,这绝对不是我想要的.

谢谢.

cmake

10
推荐指数
1
解决办法
2万
查看次数

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

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

我有几个目标文件构建的静态库.这些目标文件提供了一系列符号,与以下内容相关联:

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

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 …

c++ linker g++

5
推荐指数
1
解决办法
5445
查看次数

标签 统计

c++ ×1

cmake ×1

g++ ×1

linker ×1