从现有的Makefile创建CMakeLists文件

19

我想使用cmake为C++项目生成构建文件。我已经有一个现有的Makefile。 使用标准的cmake语法生成此Makefile时出现了问题。

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

(或者) 是否有一个简单的工具可以从Makefile生成CMakeList.txt文件。

3个回答

12

遗憾的是,从Makefile到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

就像这样:

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

当您想要链接库时,不应使用add_dependencies。 链接意味着依赖关系,但仅有依赖关系是不足够的,当您需要进行链接时。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接