CMake为静态库</lib> </path>生成-L <path> -l <​​lib>链接标志

时间:2013-02-11 23:20:12

标签: cmake static-libraries static-linking

我正在使用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的内容,但似乎只涉及共享库。我对吗?

感谢您提前 我很感激。

3 个答案:

答案 0 :(得分:2)

似乎政策CMP0003可能就是您所需要的。

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

CMAKE_POLICY( SET CMP0003 OLD )

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

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:-1)

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

  

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

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

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

# 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