【问题标题】:CMakeLists.txt structureCMakeLists.txt 结构
【发布时间】: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 项目,哪个是最佳解决方案?

【问题讨论】:

    标签: c++ makefile 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)
      
      1. 这可能是一种可能的格式。输入空格分隔的 .cpp 和 .h 文件。如果 cpp/.h 文件包含空间,则将其写入 double 引号。

      2. 您可以根据自己的需要编辑 C++ 标准。

      3. 这是一个非常基本的设置, 随意根据您的要求添加内容。

      【讨论】:

      • 我不需要为任何源文件添加任何 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。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多