【发布时间】: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