cmake使用一个cmakelist.txt作为具有子目录的项目

时间:2014-10-31 12:19:16

标签: cmake

我想在多个子目录中构建我的代码,但我不想在每个新的子目录中创建一个新的cmakelist.txt。

我的文件夹结构是这样的:

project
  >cmakelist.txt
  >build
  >src
   >main.cpp
   >multiple_subdirs_or_(c|h)pp_files_with_more_subdirs_or_(c|h)pp_files

我的cmakelist.txt看起来像这样:

...
file(GLOB_RECURSE cpps RELATIVE ${CMAKE_CURRENT_LIST_DIR}  "src/*.cpp")
file(GLOB_RECURSE hpps RELATIVE ${CMAKE_CURRENT_LIST_DIR}  "src/*.hpp")  

#remove files with main
list(REMOVE_ITEM cpps "src/test.cpp")

#bins
add_executable(test src/test.cpp src/test.cpp ${hpps} ${cpps})

#same problem if this is used instead of the other add_executable
add_library(foo OBJECT ${cpps} ${hpps})
add_executable(test src/test.cpp $<TARGET_OBJECTS:foo>)

我的档案问题:

执行cmake后创建的源文件未编译,如果使用它们,则构建失败。 正如http://www.cmake.org/cmake/help/v3.0/command/file.html在GLOB节中预测的那样:

  

我们不建议使用GLOB从中收集源文件列表   你的源代码树。如果源没有更改CMakeLists.txt文件   添加或删除然后生成的构建系统无法知道何时   让CMake重新生成。

问题:是否可以将单个cmakelist.txt用于具有多个子目录的项目? (没有文件问题(GLOB ...))

2 个答案:

答案 0 :(得分:4)

回答你的问题:是的,可以处理一个包含多个子目录和一个CMakeLists.txt的项目。我有两个考虑因素需要考虑:

  1. 我强烈建议您不要使用file(GLOB ...)作为来源。
  2. 您必须手动列出文件。例如(src/是source-subdirectory):

    set(cpps src / file1.cpp src / file2.cpp src / file3.cpp)

答案 1 :(得分:4)

这里有两件完全不相关的东西。

首先,您是否只能为整个项目使用一个CMakeLists.txt文件?是的,当然你可以(虽然我个人在项目达到一定规模后不会这样做),而且你已经这样做了。

第二,GLOB的问题。您已经引用了文档的一部分,其中说明了GLOB的使用存在的问题。如果您想继续使用GLOB,目前无法避免这种情况,因为这是cmake设计的一部分,它们区分配置和构建时间内完成的工作。另一种方法是手动列出所有文件。无论是在项目主目录中的单个CMakeLists.txt文件中执行此操作,还是在子目录中的多个文件中执行此操作都无关紧要。