从现有Makefile创建CMakeLists文件

时间:2012-04-03 01:02:24

标签: c++ linux makefile cmake

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

如何在-lstdc++ -lpthread -lboost_thread-mt的{​​{1}}部分中添加TARGET_LINK_LIBRARIES等标准C ++库?或者这些文件是否应包含在cmake部分中。

(OR) 是否有一个简单的工具可以从ADD_DEPENDENCIES

生成CMakeList.txt文件

3 个答案:

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