我正在使用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的内容,但似乎只涉及共享库。我对吗?
感谢您提前 我很感激。
答案 0 :(得分:2)
似乎政策CMP0003可能就是您所需要的。
要使用它,请在CMakeLists.txt
的开头附近添加以下行:
CMAKE_POLICY( SET CMP0003 OLD )
另一种可能性是直接设置依赖关系和搜索路径,但这不是最干净的方式。假设您的库名为liba.a
和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目标,因此需要一些机制来正确设置依赖项。
答案 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