Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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
Build CMake将来自不同CMakeLists.txt的对象附加到一个库中_Build_Cmake_Linker_Unix Ar - Fatal编程技术网

Build CMake将来自不同CMakeLists.txt的对象附加到一个库中

Build CMake将来自不同CMakeLists.txt的对象附加到一个库中,build,cmake,linker,unix-ar,Build,Cmake,Linker,Unix Ar,我想从多个子目录中的对象创建一个库,每个子目录都包含自己的CMakeLists.txt,并使用对象库技巧使多个目标具有不同的编译选项 以下是文件: project_dir |--- subdir1 | |--- src1.c | |--- CMakeLists.txt |--- subdir2 | |--- src2.c | |--- CMakeLists.txt |--- CMakeLists.txt 所有CMakeLists.txt的内容 // project_di

我想从多个子目录中的对象创建一个库,每个子目录都包含自己的CMakeLists.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文件更改为以下内容,但仍然无法解决我的问题

// 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?
//项目目录/subdir/CMakeLists.txt
添加库(lib11对象src1.c)
设置_目标_属性(lib11属性编译_标志“some-flags11”)
添加库(lib12对象src1.c)
设置目标属性(lib12属性编译标记“some-flags12”)
添加库(lib1 STATIC$$)
//上面的add_库不能是可以解决我的问题的对象。
//如何将lib1(lib11和lib12)附加到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)
add_库(lib11对象test1/sub1/src1.c)
设置\u目标\u属性(lib11属性编译\u标志“-DF1”)
添加库(lib12对象test1/sub1/src1.c)
设置目标属性(lib12属性编译标记“-DF2”)
添加_库(lib1接口)
目标源(lib1接口$)
目标源(lib1接口$)
添加库(lib21对象test1/sub2/src2.c)
设置目标属性(lib21属性编译标记“-DF1”)
添加库(lib22对象test1/sub2/src2.c)
设置目标属性(lib22属性编译标记“-DF2”)
添加_库(lib2接口)
目标源(lib2接口$)
目标源(lib2接口$)
添加_库(父接口)
目标链接库(父接口lib1)
目标链接库(父接口lib2)
添加库(核心对象src.c)
添加\u库(GPARENT STATIC$)
目标链接库(GPARENT接口父级)
多个对象库可以合并到一个接口库中:

可以进一步组合接口库:

# 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)
结果库的“链”可以是任意长度


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

尽管在调用
target\u link\u libraries()
命令时可能无法直接命名对象库,但可以使用其Interface\u SOURCES target属性设置为name
$
的接口库间接“链接”对象库


我只是使用
set
PARENT\u 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)
add_子目录(lib11)
添加库(${PROJECT\u NAME}对象src1.c)
列表(附加对象$)
集合(对象${OBJECTS}父范围)

感谢您的回复。我已经查过那个链接了。我可以使用相同的技术在子目录的CMakeLists.txt中组合不同的静态库(对象),即使用lib11和lib12对象以及类似的lib2创建lib1。你似乎无法将这项技术链接起来,从而解决我的问题。我不想在我的主CMakeLists.txt中添加每个单独的对象库(例如lib11、lib12、lib21、lib22)。如果我遗漏了什么,请解释一下。嗯,那么你想用不同的标志编译同一个对象库,是吗?如果是,那么您就不能-这将破坏对象库作为一组预编译对象文件的核心用途。只需将源文件列表保存到某个变量中,并在创建具有适当编译器标志的主库时使用此列表。再次感谢您的回复。对我需要使用不同的标志多次编译子目录中相同的源文件。要做到这一点,并将所有对象文件放在同一个库中,最好的方法是什么?换句话说,如果我在顶级CMakeLists.txt中添加了_库(mainLib),那么如何在这个mainLib中添加更多的对象文件(来自子目录object libs)?完美。这就是我要找的。一个相关的问题:是否有可能将其链接起来?我的意思是,如果我在目录树中有另一层,是的,可以进一步链接接口库。我已经更新了答案。再次感谢您的回复和更新的答案。我尝试按照您的建议组合接口库,然后使用组合接口库构建了一个上层库。构建过程是可行的,但出于某种原因,上层库不包含组合接口库中的任何对象/符号。我还尝试向接口库添加显式依赖项,但仍然没有更改。我还需要做什么吗?奇怪!我也在Linux上使用CMake 3.10.2。你在用新的CMake吗?我用过CMake 3.4左右。你能给我看一下不适合你的代码吗?
set(OBJECTS)

add_subdirectory(lib1)
add_subdirectory(lib2)

add_library(lib STATIC ${OBJECTS})
add_subdirectory(lib11)

add_library(${PROJECT_NAME} OBJECT src1.c)
list(APPEND OBJECTS $<TARGET_OBJECTS:${PROJECT_NAME}>)
set(OBJECTS ${OBJECTS} PARENT_SCOPE)