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

bed*_*uin 10 cmake

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

谢谢.

Mat*_*Mat 33

这个线程将静态库链接到共享库?有一个方法.

SET (MYLIB -Wl,--whole-archive my_particular_lib -Wl,--no-whole-archive)
....
TARGET_LINK_LIBRARIES(yourtarget ${normalstuff} ${MYLIB} ${othernormalstuff})
Run Code Online (Sandbox Code Playgroud)

CMake的文档状态:

如果库名称与项目中另一个目标的库名称匹配,则会在构建系统中自动添加依赖项,以确保链接库在目标链接之前是最新的.以" - "开头但不是"-l"或"-framework"的项目名称被视为链接器标志.

所以这些-Wl选项不应该被CMake干扰/接触.

  • 我认为重要的是要注意,如果 my_particular_lib 具有其他静态库作为通过调用添加的依赖项,则这*不起作用*:target_link_libraries(my_particular_lib ... my_other_particular_lib)。它不会将 --whole-archive 和 --no-whole-archive 保持在正确的位置。 (2认同)