CMakeLists.txt 结构

Posted

技术标签:

【中文标题】CMakeLists.txt 结构【英文标题】:CMakeLists.txt structure 【发布时间】:2018-08-17 16:28:38 【问题描述】:

我想开始一个 cmake 项目,我有很多文件。结构如下。

types.h 包含在 functions.hdag.h

functions.h 包含在basic.cpp, br.cpp, IR.cppUIR.cpp

functions.hdag.h 包含在 dag.cpp, dag-cmp.cpp, dag-cover.cpp, dag-make.cppdag-sum.cpp

显然我在同一目录中也有一个main.cpp,其中包括types.h, dag.hfunctions.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

在CMake项目中带有前缀的头文件

4. CMake 系列 - 项目添加编译选项

cmake - CMakeLists.txt 不在根文件夹中(但包含在源代码中)

cmake没有将目标移动到安装目录

cmake 引用子目录的库