9

我正在使用 CMake 2.8 来构建基于 MQX OS 的应用程序(使用 CodeWarrior)。
CMake 项目基本上构建了一组静态库(比如说 LIB1 和 LIB2)。
然后我在最终的可执行 cmake 规则中引用这些库:

target_add_executable(X ${some_sources})
target_link_libraries(X LIB1 LIB2)

我的问题是一些符号是在多个库中定义的。
因此,像这样的链接命令:

mwldarm <args> -o <output> <objects> /path/to1/libLIB1.a /path/to2/libLIB2.a

会导致多重定义符号错误。相反,我希望 CMake 生成如下链接命令:

mwldarm <args> -o <output> <objects> -L/path/to1 -L/path/to2 -lLIB -lLIB2

问题:如何从 CMAKE 中获取以下变量?

  • 库目录标志(例如 -L/path/to1 -L/path/to2:)
  • 库链接标志(例如-lLIB -lLIB2:)

我已经阅读了有关 RPATH 的内容,但它似乎只涉及共享库。我对吗?

感谢提前。
我很感激。

4

3 回答 3

3

看来CMP0003政策可能是您所需要的。

要使用它,请在您的开头附近添加以下行CMakeLists.txt

CMAKE_POLICY( SET CMP0003 OLD )

另一种可能性是直接设置依赖项和搜索路径,但这不是最干净的方式。假设您的库被称为liba.aand libb.a,那么:

LINK_DIRECTORIES( ${paths_to_search_for} )
TARGET_ADD_EXECUTABLE(X ${some_sources} )
ADD_DEPENDENCIES(X LIB1 LIB2)
TARGET_LINK_LIBRARIES(X a b )

请注意,在这种情况下a,并且b不是 cmake 目标,因此需要一些机器来正确设置依赖项。

于 2013-02-12T15:12:44.613 回答
1

CMake 的部分设计是它与完整路径链接。为什么这是个问题?

使用策略切换行为不是正确的方法。

http://www.cmake.org/gitweb?p=cmake.git;a=commitdiff;h=cd4fa896b

于 2014-10-21T22:02:40.183 回答
-1

我认为CMP0003用于打开/关闭自动添加搜索路径的功能,如官方文档中所述

通过完整路径链接的库不再生成链接器搜索路径。

而不是用 . 替换路径名-l

链接库时,如果该库是已知的目标 CMake,则 CMake 始终将相关-L-l选项替换为库的路径名。对于链接静态库,这可能不是问题。但是对于链接共享库的可执行文件来说,这可能是个问题。然后我找到了一种黑客方法,代码如下,解决使用-L和'-l'而不是绝对路径链接一个线程库的问题。

# Find out the link.txt      
set(LINK_TXT "${CMAKE_BINARY_DIR}/${ToLinkLib}/CMakeFiles/${ToLinkLIb}.dir/link.txt")

# Add the searching path into link command
add_custom_command(TARGET ${YourTarget} PRE_BUILD
  COMMAND sed ARGS -ie "\"s;[[:blank:]]-l; -L${LIBRARY_OUTPUT_PATH} -l;\"" ${LINK_TXT}
  DEPENDS ${LINK_TXT}
  COMMENT "Hacking CMake: edit __link.txt__ to use -l instead of path to link internal library ...")

# NOTE: Dont't missing the `-l'. 
target_link_libraries(${YourTarget} -l${ToLinkLib})

当然,这只是一种黑客行为,因此可能不适用于所有版本的 CMake。


更新为什么链接共享库可能是一个问题?

当我运行为 android 交叉编译的可执行文件时,它链接由相同 CMake 脚本构建的共享库,我遇到了链接失败的问题。在我使用上述黑客方法获取新版本后,我可以使用如下命令运行我的可执行文件

 $ LD_LIBRARY_PATH=. ./the_exe opts
于 2014-10-15T04:46:57.297 回答