CMakeLists.txt 结构
Posted
技术标签:
【中文标题】CMakeLists.txt 结构【英文标题】:CMakeLists.txt structure 【发布时间】:2018-08-17 16:28:38 【问题描述】:我想开始一个 cmake 项目,我有很多文件。结构如下。
types.h
包含在 functions.h
和 dag.h
中
functions.h
包含在basic.cpp, br.cpp, IR.cpp
和UIR.cpp
中
functions.h
和 dag.h
包含在 dag.cpp, dag-cmp.cpp, dag-cover.cpp, dag-make.cpp
和 dag-sum.cpp
中
显然我在同一目录中也有一个main.cpp
,其中包括types.h, dag.h
和functions.h
对于 CMakeLists.txt 和 cmake 项目,哪个是最佳解决方案?
【问题讨论】:
【参考方案1】:我认为没有最好的解决方案,但我更喜欢以下解决方案:
cmake_minimum_required(VERSION 3.12)
project(myproject)
set(SOURCE_FILES
basic.cpp
br.cpp
IR.cpp
UIR.cpp
dag.cpp
dag-cmp.cpp
dag-cover.cpp
dag-make.cpp
dag-sum.cpp
main.cpp
)
set(HEADER_FILES
types.h
functions.h
dag.h
)
add_executable($PROJECT_NAME $SOURCE_FILES $HEADER_FILES)
target_compile_features($PROJECT_NAME PRIVATE cxx_std_14)
使用变量$PROJECT_NAME
可以轻松更改项目名称,因为您只需更改一次。
包含所有头文件和源文件允许 IDE 知道这些文件属于项目。
设置目标的属性应该优先于更改 CMake 变量。因此,我鼓励使用target_compile_features
而不是set(CMAKE_CXX_STANDARD 14)
【讨论】:
【参考方案2】:cmake_minimum_required(VERSION 3.12)
project(myproject)
set(CMAKE_CXX_STANDARD 14)
add_executable(myproject all.cpp all.h)
这可能是一种可能的格式。输入空格分隔的 .cpp 和 .h 文件。如果 cpp/.h 文件包含空间,则将其写入 double 引号。
您可以根据自己的需要编辑 C++ 标准。
这是一个非常基本的设置, 随意根据您的要求添加内容。【讨论】:
我不需要为任何源文件添加任何 add_library 吗? 视情况而定!你需要建库吗? 现在我想使用 cmake 运行这个 main.cpp。但是这个 main.cpp 使用了我提到的 sources.cpp 中声明的函数和结构(这些是我的 main.cpp 的源库吗?)。第二步是将项目链接到外部库。 我不这么认为。在将所有 cpps 添加到 add_executable 后尝试编译它。它可以工作。也不要忘记接受这个作为答案! 我下载了一个库并使用 cmake 构建它。它被称为海普罗。如何将该库链接到我的外部 cmake 项目之一?【参考方案3】:假设您的所有文件都在 src/ 文件夹中。 CMake 可以自动列出它们:
file(GLOB_RECURSE source_files src/*)
add_executable(exec $source_files)
第一行将查找 src 文件夹(及其子文件夹)中的所有文件,并将列表存储在 source_files var 中。 第二行将从source_files var加载文件并将它们添加到可执行文件'exec'中
【讨论】:
GLOB_RECURSE 是一个糟糕的解决方案。 CMake 不知道何时重新运行 cmake,因此会忽略新文件。如果您可以使用 CMake 3.12,则使用 CONFIGURE_DEPENDS 选项会更好:cmake.org/cmake/help/v3.12/command/file.html#glob-recurse 是的,我没想到。使用 GLOB_RECURSE,我们必须在每次修改文件树时重新运行 CMake。以上是关于CMakeLists.txt 结构的主要内容,如果未能解决你的问题,请参考以下文章
cmake基础教程(11)add_subdirectory如何添加非子目录的CMakeLists.txt