Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake 具有多个组件的基本项目设置_Cmake - Fatal编程技术网

Cmake 具有多个组件的基本项目设置

Cmake 具有多个组件的基本项目设置,cmake,Cmake,建立一个包含多个独立组件的项目的最佳方式是什么 我的项目没有顶级CMakeLists文件,它由多个组件组成。其中一些可以独立构建,而另一些则依赖于其他组件。 例如,组件A和B可以自己构建和使用(可能由几个单独的目标组成),而组件C需要A和B来构建 项目布局: ├───component_A │ CMakeLists.txt │ main.cpp │ ├───component_B │ CMakeLists.txt

建立一个包含多个独立组件的项目的最佳方式是什么

我的项目没有顶级CMakeLists文件,它由多个组件组成。其中一些可以独立构建,而另一些则依赖于其他组件。 例如,组件A和B可以自己构建和使用(可能由几个单独的目标组成),而组件C需要A和B来构建

项目布局:

    ├───component_A
    │       CMakeLists.txt
    │       main.cpp
    │
    ├───component_B
    │       CMakeLists.txt
    │       main.cpp
    │
    └───component_C
             CMakeLists.txt
             main.cpp

我可以看到3种可能性,但没有一种是有效的或可行的:

  • 使用add_子目录(component_A CMAKE_BINARY_DIR/component A)

  • ExternalProject_Add()似乎太有限,无法处理广泛的组件

  • 将每个组件视为一个包,并使用find_包 包括他们。配置、安装等将如何工作 这个案子


  • 一个直截了当的解决方案是使用一些CMake创建一个顶级CMake,让您能够控制整个项目中包含的内容。这些选项将填充并可以在CMake GUI中更改,但是如果从命令行运行
    CMake
    ,也可以控制这些选项。以下是针对您的情况的简单顶级CMake文件:

    cmake_minimum_required(VERSION 3.11)
    
    project(TopLevelProject)
    
    # Define options to easily turn components ON or OFF.
    option(ENABLE_COMPONENT_A "Option to include component A" ON)
    option(ENABLE_COMPONENT_B "Option to include component B" OFF)
    option(ENABLE_COMPONENT_C "Option to include component C" OFF)
    
    # Determine which components are included and built by default in ALL_BUILD.
    if(ENABLE_COMPONENT_C)
        # Need all three components in this case.
        add_subdirectory(component_A)
        add_subdirectory(component_B)
        add_subdirectory(component_C)
    else()
        if(ENABLE_COMPONENT_A)
            add_subdirectory(component_A)
        endif()
        if(ENABLE_COMPONENT_B)
            add_subdirectory(component_B)
        endif()
    endif()
    

    在本例中,只有选项A在上,因此生成的buildsystem中只包含组件A。即使包含所有组件,您仍然可以在生成buildsystem后选择单独构建哪些项目(或目标)。

    “我可以看到3种可能性,但它们似乎都不高效或可行”-实际上,它们中的任何一种都可以工作。试试看。