我想使用cmake
为C++项目生成我的构建文件。我有一个现有的Makefile
。 我在使用标准cmake
语法生成此Makefile
时遇到问题。从现有Makefile创建CMakeLists文件
如何在cmake
的TARGET_LINK_LIBRARIES
部分包含标准C++库,如-lstdc++ -lpthread -lboost_thread-mt
?或者这些文件应该包含在ADD_DEPENDENCIES
部分。
(OR) 有一个简单的工具,它从Makefile
我想使用cmake
为C++项目生成我的构建文件。我有一个现有的Makefile
。 我在使用标准cmake
语法生成此Makefile
时遇到问题。从现有Makefile创建CMakeLists文件
如何在cmake
的TARGET_LINK_LIBRARIES
部分包含标准C++库,如-lstdc++ -lpthread -lboost_thread-mt
?或者这些文件应该包含在ADD_DEPENDENCIES
部分。
(OR) 有一个简单的工具,它从Makefile
不幸的是,没有直接的1:从Makefile 1转换为CMakeLists。由于CMake应该在所有平台上运行,因此它不能依赖像GNU make这样的特定于平台的假设,这在某些地方会使事情变得复杂。
特别是,CMake提供了一个非常强大且相当复杂的使用库的机制:您可以使用库的名称调用find_package,它将调用cmake模块路径中的库搜索脚本。这个脚本(也是用CMake编写的)将尝试检测库的头文件和lib文件的位置,并将它们存储在一对CMake变量中,然后可以将它们传递给相应的CMake命令,例如include_directories和target_link_libraries。
这种方法有两个问题:首先,你需要一个搜索脚本。幸运的是,CMake为Pthreads,Boost和其他一些搜索脚本提供了搜索脚本,但如果您使用的是更特殊的库,您可能必须自己编写搜索脚本,这首先是一种神秘的体验......
第二个主要问题是搜索脚本没有标准方式返回结果。尽管所使用的变量有命名约定,但通常不适用。在实践中,这意味着您将不得不查看搜索脚本的来源以了解如何使用它。幸运的是,CMake附带的脚本大部分都有很好的文档记录。
内置脚本位于<cmake-install-prefix>/share/cmake-2.8/Modules
之类的地方。对于你的问题,查看FindBoost.cmake和FindThreads.cmake文件(CMake应该自动链接到标准库)。 Anycorn已经提供了使用Boost脚本的一些示例代码,您需要知道的所有其他信息都在CMake文档中或直接在搜索脚本文件中。
像这样生成CMakeList.txt
文件:
target_link_libraries(your-target-name pthread boost_thread-mt etc)
当你想链接库,则不应使用add_dependencies。链接意味着一个依赖关系,但是当你需要链接的时候,依赖关系就不够了。
有增强你真的需要使用包装取景
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})