2012-04-03 94 views
13

我想使用cmake为C++项目生成我的构建文件。我有一个现有的Makefile。 我在使用标准cmake语法生成此Makefile时遇到问题。从现有Makefile创建CMakeLists文件

如何在cmakeTARGET_LINK_LIBRARIES部分包含标准C++库,如-lstdc++ -lpthread -lboost_thread-mt?或者这些文件应该包含在ADD_DEPENDENCIES部分。

(OR) 有一个简单的工具,它从Makefile

回答

9

不幸的是,没有直接的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文档中或直接在搜索脚本文件中。

2

像这样生成CMakeList.txt文件:

target_link_libraries(your-target-name pthread boost_thread-mt etc) 

当你想链接库,则不应使用add_dependencies。链接意味着一个依赖关系,但是当你需要链接的时候,依赖关系就不够了。

2

有增强你真的需要使用包装取景

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})