gpt4 book ai didi

cmake 对带有子目录的项目使用一个 cmakelist.txt

转载 作者:行者123 更新时间:2023-12-03 18:19:00 25 4
gpt4 key购买 nike

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

We do not recommend using GLOB to collect a list of source files from your source tree. If no CMakeLists.txt file changes when a source is added or removed then the generated build system cannot know when to ask CMake to regenerate.

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

最佳答案

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

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

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

关于cmake 对带有子目录的项目使用一个 cmakelist.txt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26674558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com