【问题标题】:cmake use one cmakelist.txt for a project with subdirectoriescmake 对带有子目录的项目使用一个 cmakelist.txt
【发布时间】:2014-12-27 18:24:14
【问题描述】:

我喜欢在多个子目录中构建我的代码,但我不想在每个新子目录中创建一个新的 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 ...))

【问题讨论】:

  • 您可以运行目标 make rebuild_cache 以使 cmake 再次运行 globbing 表达式,它会选择新文件 - 但正如其他人在答案中建议的那样,最好手动列出所有文件(这意味着您还必须在 CMakeLists.txt 中添加新文件,并且当文件更改时,cmake 会自动重新构建缓存)。

标签: cmake


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    回答您的问题:是的,可以处理具有多个子目录和一个 CMakeLists.txt 的项目。我有两个注意事项供您考虑:

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

      设置(cpps src/file1.cpp src/file2.cpp src/file3.cpp)

    【讨论】:

    • 这并没有回答他的问题“是否可以使用单个 cmakelists.txt”?
    • @Andre 现在它确实回答了这个问题,但我发现 Phil Be 的回答更好,这就是我支持它的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多