【问题标题】:cmake target_link_librariescmake target_link_libraries
【发布时间】:2012-01-26 17:32:44
【问题描述】:

我有一些 target_link_libraries :

add_library(x x.cc)
target_link_libraries(x depX1 depX2 depX3)
add_executable(exe exe.cc)
target_link_libraries(exe x ${shared_lib1} ${shared_lib2})

这会导致 exe 链接到 x 和 x 的依赖项:depx1、depx2 等 问题是 shared_libs 插在 x 和 x 的依赖项之间,这在 g++ 4.6 中是不可接受的(它在旧版本中有效)。

如何解决?我需要将共享库放在编译行的末尾,就像我在 CMakeLists.txt 文件中指定的那样。所以我不希望它们插入,我希望它们在编译行的末尾。另请注意,depx1、depx2 depx3 等也有自己的依赖项,所以我唯一想要的是共享库出现在编译行的末尾。

如何用 cmake 做到这一点? 谢谢

--稍后编辑2-- => 已解决 这可以通过使用丑陋的 hack 来解决:

add_custom_command(TARGET TargetName
                   PRE_LINK COMMAND ${PROJECT_SOURCE_DIR}/custom_script.sh 
                   ARGS ${PROJECT_BINARY_DIR}/src/TargetName/CMakeFiles/TargetName.dir/link.txt)

其中 src/TargetName/CMakeFiles/TargetName.dir/link.txt 是 CMake 生成的链接命令行,而 custom_script.sh 是一个脚本,它解析文件并将动态链接库安排在编译行的末尾。

--稍后编辑--
所以我明白,使用当前的 CMake 并且没有选项将共享库放在编译行的末尾以及使用 g++4.6,一切都会中断!这太棒了!

【问题讨论】:

  • 您能否显示make VERBOSE=1 的输出,看看究竟是什么问题?
  • 嗨,输出类似于以下内容:/usr/bin/c++ -g -O2 -Wall -pthread -static x -shared_lib1 -shared_lib2 depX2 depX3。我希望 shared_lib1 和 shared_lib2 位于编译行的末尾
  • 如果你指定你想要一个静态库怎么办,比如:add_library(x STATIC x.cc)?另外,尝试对target_link_libraries 进行两次调用,一次调用 x,一次调用共享库。
  • @MichalKottman,我希望您知道 add_library 的默认说明符为 STATIC。
  • 如果链接顺序很重要,这是否意味着您的 shared_libs 依赖于 depX1、2、3?目前您的 CMakeLists 中没有这种依赖项 为什么不列出 depX1,2,3 两次?一次在 x 和 shared-libs 之间,最后一次?

标签: cmake


【解决方案1】:

您是否尝试重复 x 依赖项?例如:

target_link_libraries(exe x depX1 depX2 depX3 ${shared_lib1} ${shared_lib2})

【讨论】:

  • 这不是一个选项,因为 depX1, depX2, depX3 也有依赖关系,它会产生一个非常长的字符串,很难维护。我已经解释过了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 2013-09-10
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
相关资源
最近更新 更多