首页 文章

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

提问于
浏览
2

我喜欢在多个子目录中构建我的代码,但我不想在每个新的子目录中创建一个新的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执行后创建的源文件,如果使用它们,则构建失败 . 由GLOB部分http://www.cmake.org/cmake/help/v3.0/command/file.html预测:

我们不建议使用GLOB从源树中收集源文件列表 . 如果在添加或删除源时没有更改CMakeLists.txt文件,则生成的构建系统无法知道何时请求CMake重新生成 .

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

2 回答

  • 4

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

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

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

  • 3

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

    • 我强烈建议您不要使用 file(GLOB ...) 作为来源 .

    • 您必须手动列出文件 . 例如( src/ 是source-subdirectory):

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

相关问题