我想使用cmake
为C ++项目生成构建文件。我有一个Makefile
。
我在使用标准Makefile
语法生成此cmake
时遇到问题。
如何在-lstdc++ -lpthread -lboost_thread-mt
的{{1}}部分中添加TARGET_LINK_LIBRARIES
等标准C ++库?或者这些文件是否应包含在cmake
部分中。
(OR)
是否有一个简单的工具可以从ADD_DEPENDENCIES
CMakeList.txt
文件
答案 0 :(得分:9)
不幸的是,从Makefile到CMakeLists没有直接的1:1转换。由于CMake应该在所有平台上运行,因此它不能依赖于像GNU make那样的平台特定假设,这会使某些地方的事情变得复杂。
特别是,CMake为使用库提供了一种非常强大且相当复杂的机制:使用库的名称调用find_package,它将从您的cmake模块路径调用库搜索脚本。此脚本(也是用CMake编写的)将尝试检测库的头文件和lib文件的位置,并将它们存储在几个CMake变量中,然后可以将这些变量传递给相应的CMake命令,如include_directories和target_link_libraries
这种方法存在两个问题:首先,您需要一个搜索脚本。幸运的是,CMake附带了Pthreads,Boost和其他几个的搜索脚本,但是如果你使用的是更具异国情调的库,你可能必须自己编写搜索脚本,这首先是一种神秘的体验...... / p>
第二个主要问题是搜索脚本没有标准的方式来返回结果。虽然使用的变量有命名约定,但通常不适用。在实践中,这意味着您必须查看搜索脚本的来源以了解如何使用它。幸运的是,CMake附带的脚本大部分都有很好的文档记录。
内置脚本位于<cmake-install-prefix>/share/cmake-2.8/Modules
之类的位置。对于您的问题,请查看FindBoost.cmake和FindThreads.cmake文件(CMake应自动链接到标准库)。 Anycorn已经提供了一些使用Boost脚本的示例代码,您需要知道的其他所有内容都在CMake文档中或直接在搜索脚本文件中。
答案 1 :(得分:2)
像这样:
target_link_libraries(your-target-name pthread boost_thread-mt etc)
如果要链接库,则不应使用add_dependencies。链接意味着依赖关系,但是当您需要链接时,仅依赖关系是不够的。
答案 2 :(得分:2)
使用Boost,你真的需要使用包查找器
set(Boost_ADDITIONAL_VERSIONS "1.46" "1.46.0" "1.46.1")
set(Boost_USE_MULTITHREADED ON) # for -mt
find_package(Boost COMPONENTS thread)
if(Boost_FOUND)
MESSAGE(STATUS "Found Boost: ${Boost_LIBRARY_DIRS}")
MESSAGE(STATUS "Found Boost libraries: ${Boost_LIBRARIES}")
set(LIBRARIES "${LIBRARIES};${Boost_LIBRARIES}")
else()
MESSAGE(FATAL_ERROR "Boost Thread NOT FOUND")
endif()
target_link_libraries(executable ${LIBRARIES})