【问题标题】:CMake: build target library if any of the executable targets needs itCMake:如果任何可执行目标需要它,则构建目标库
【发布时间】:2023-04-07 03:59:02
【问题描述】:

我的项目布局如下:

src/
    include/
           include1.h
           include2.h
           include3.h

    lib/
        lib1/
            source1_lib1.c
            source2_lib1.c
        lib2/
            source1_lib2.c
            source2_lib2.c
            source3_lib2.c
        lib3/
            source1_lib3.c
        lib4/
            source1_lib4.c
            source2_lib4.c

    module_A/ (this module will need lib1 and lib4)
            source1_moduleA.c
            source2_moduleA.c

    module_B/ (this module will need lib2 and lib3)
            source1_moduleB.c
            source2_moduleB.c
            source3_moduleB.c

    module_C/ (this module will need lib1, lib2, lib3 and lib4)
            source1_moduleC.c

    module_D/ (this module will need lib1 and lib3)
            source1_moduleD.c
            source2_moduleD.c
            source3_moduleD.c
            source4_moduleD.c

全局解决方案可以由任意数量的module_X(取决于客户)来完成

我的项目 CMake 文件位于“/src”下,包括一个配置文件(由客户需求定义)。此配置文件指示必须为目标客户构建和打包哪些模块。

假设我有一个客户 X,他选择的模块是 module_A 和 module_D。在这种情况下,我的构建系统应该只构建 lib_1、lib_3 和 lib_4。

我正在寻找的是一种无需构建即可定义目标库的方法,直到我在 module_X 目录下的 CMakeLists 文件中引用它们。

哦,对不起,我错过了非常感谢您的帮助

【问题讨论】:

    标签: build cmake shared-libraries


    【解决方案1】:

    CMake 无法做到这一点。通过add_library 调用添加的任何库都将被构建。

    但是您可以在 CMake 中实现您想要的行为。您可以调用自定义包装函数,而不是直接调用 add_libraryadd_executableadd_library 包装器只存储调用add_library 所需的信息,但不直接调用它。 add_executable 包装器会遍历可执行文件的所有依赖项,并在需要时调用 add_library

    您必须设计自己的系统来维护特定库是否已添加的状态以及构建库目标的参数。在考虑瞬态依赖时,事情也会变得稍微困难​​一些(module_1 依赖于 lib_a,而 lib_a 又依赖于 lib_b;但没有可执行文件直接依赖于 lib_b)。但是用几百行 CMake 代码构建这样一个系统是完全可能的。

    【讨论】:

      【解决方案2】:
      cmake ..
      make module_A module_D
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-20
        • 1970-01-01
        • 2017-10-07
        • 1970-01-01
        • 1970-01-01
        • 2020-08-30
        • 1970-01-01
        • 2016-08-02
        相关资源
        最近更新 更多