代码之家  ›  专栏  ›  技术社区  ›  Rakib

CMake附加来自不同CmakeList的对象。txt到一个库中

  •  4
  • Rakib  · 技术社区  · 6 年前

    我想从多个子目录中的对象创建一个库,每个子目录都包含自己的CmakeList。txt和对象库技巧,使多个目标具有不同的编译选项。

    以下是文件:

    project_dir
    |--- subdir1
    |    |--- src1.c
    |    |--- CMakeLists.txt
    |--- subdir2
    |    |--- src2.c
    |    |--- CMakeLists.txt
    |--- CMakeLists.txt
    

    所有CMakeLists的内容。txt文件

    // project_dir/CMakeLists.txt
    // what to put here? to make one single library (mainLib)
    
    
    // project_dir/subdir1/CMakeLists.txt
    add_library(lib11 OBJECT src1.c)
    set_target_properties(lib11 PROPERTIES COMPILE_FLAGS "some-flags11")
    
    add_library(lib12 OBJECT src1.c)
    set_target_properties(lib12 PROPERTIES COMPILE_FLAGS "some-flags12")
    // here I would like to add lib11:objects and lib12:objects to mainLib
    // how should it be done?
    
    // project_dir/subdir2/CMakeLists.txt
    // *** similar to subdir1 but with src2.c that creates lib21 and lib22
    // here I would like to add lib21:objects and lib22:objects to mainLib
    // how should it be done?
    

    是否可以在平台上独立完成?谢谢

    编辑: 基于 CMake: how create a single shared library from all static libraries of subprojects? ,我可以将cmake文件更改为以下内容,但仍然无法解决我的问题。

    // project_dir/subdir1/CMakeLists.txt
    add_library(lib11 OBJECT src1.c)
    set_target_properties(lib11 PROPERTIES COMPILE_FLAGS "some-flags11")
    
    add_library(lib12 OBJECT src1.c)
    set_target_properties(lib12 PROPERTIES COMPILE_FLAGS "some-flags12")
    
    add_library(lib1 STATIC $<TARGET_OBJECTS:lib11> $<TARGET_OBJECTS:lib12>)
    
    // Above add_library cannot be OBJECT which would fix my problem.
    // how to append the lib1 (lib11 and lib12) to mainLib?
    

    编辑: 更新我的帖子,尝试按照答案中的建议链接接口库。

    add_library(lib11 OBJECT test1/sub1/src1.c)
    set_target_properties(lib11 PROPERTIES COMPILE_FLAGS "-DF1")
    
    add_library(lib12 OBJECT test1/sub1/src1.c)
    set_target_properties(lib12 PROPERTIES COMPILE_FLAGS "-DF2")
    
    add_library(lib1 INTERFACE)
    target_sources(lib1 INTERFACE $<TARGET_OBJECTS:lib11>)
    target_sources(lib1 INTERFACE $<TARGET_OBJECTS:lib12>)
    
    add_library(lib21 OBJECT test1/sub2/src2.c)
    set_target_properties(lib21 PROPERTIES COMPILE_FLAGS "-DF1")
    
    add_library(lib22 OBJECT test1/sub2/src2.c)
    set_target_properties(lib22 PROPERTIES COMPILE_FLAGS "-DF2")
    
    add_library(lib2 INTERFACE)
    target_sources(lib2 INTERFACE $<TARGET_OBJECTS:lib21>)
    target_sources(lib2 INTERFACE $<TARGET_OBJECTS:lib22>)
    
    add_library(PARENT INTERFACE)
    
    target_link_libraries(PARENT INTERFACE lib1)
    target_link_libraries(PARENT INTERFACE lib2)
    
    add_library(CORE OBJECT src.c)
    add_library(GPARENT STATIC $<TARGET_OBJECTS:CORE>)
    
    target_link_libraries(GPARENT INTERFACE PARENT)
    
    2 回复  |  直到 6 年前
        1
  •  8
  •   Tsyvarev    4 年前

    几个 对象 库可以合并到一个 接口 图书馆:

    # Create lib1 OBJECT library with some sources, compile flags and so.
    add_library(lib1 OBJECT ...)
    
    # Create lib2 OBJECT library with some sources, compile flags and so.
    add_library(lib2 OBJECT ...)
    
    # Create INTERFACE library..
    add_library(libs INTERFACE)
    # .. which combines OBJECT libraries
    target_sources(libs INTERFACE $<TARGET_OBJECTS:lib1> $<TARGET_OBJECTS:lib2>)
    

    生成的库可用于标准 target_link_libraries :

    add_library(mainLib <some-source>)
    target_link_libraries(mainLib libs)
    

    可以组合 接口 图书馆进一步:

    # Create libs_another INTERFACE library like 'libs' one
    add_library(libs_another INTERFACE)
    ..
    
    # Combine 'libs' and 'libs_another' together
    add_library(upper_level_libs INTERFACE)
    target_link_libraries(upper_level_libs INTERFACE libs libs_another)
    

    结果库的“链”可以是任意长度。


    虽然这种组合对象库的方式看起来很粗糙,但实际上 CMake documentation :

    虽然在调用 target_link_libraries() 命令,可以使用 接口库 谁的 INTERFACE\u源 目标属性设置为名称 $<TARGET_OBJECTS:objlib>

        2
  •  0
  •   Wiki Wang    5 年前

    我只是使用 set 具有 PARENT_SCOPE

    根CMakeLists。txt文件:

    set(OBJECTS)
    
    add_subdirectory(lib1)
    add_subdirectory(lib2)
    
    add_library(lib STATIC ${OBJECTS})
    

    CMakeLists。子目录中的txt:

    add_subdirectory(lib11)
    
    add_library(${PROJECT_NAME} OBJECT src1.c)
    list(APPEND OBJECTS $<TARGET_OBJECTS:${PROJECT_NAME}>)
    set(OBJECTS ${OBJECTS} PARENT_SCOPE)
    
    推荐文章