基于其他静态库生成静态库并将它们打包在一起的CMAKE

3
我有一个项目,其结构如下。 aaa和bbb是两个子目录,已编译为静态库。在上一级(文件夹)中有另一个名为ccc的项目,也被编译为静态库,而libccc.a是我想要获得的最终静态库。在libccc.a中,我希望它包括ccc项目和aaa + bbb。 我尝试更改ccc的CMakelist.txt中的链接标志,但似乎没有起作用。我猜我使用了错误的标志。
我原始的ccc cmakelist.txt如下:
add_subdirectory(aaa)
add_subdirectory(bbb)
set(sources cccsrc1.cpp cccsrc2.cpp)
include_directories(${incdir})
add_library(ccc STATIC sources)
target_link_libraries(ccc aaa bbb)
那么,有谁知道如何更改cmake文件以告诉ccc生成静态库,其中还包括所有aaa和bbb代码?
2个回答

4
使用 对象库
cmake_minimum_required(VERSION 3.2)
project(masterlib)

file(WRITE lib1.c "int lib1_f() {return 555;}")
file(WRITE lib2.c "int lib2_f() {return 555;}")

add_library(lib1 OBJECT lib1.c)
add_library(lib2 OBJECT lib2.c)

add_library(masterlib STATIC $<TARGET_OBJECTS:lib1> $<TARGET_OBJECTS:lib2>)

1
我认为你应该在target_link_libraries()中指定PUBLIC关键字,像这样:
target_link_library(ccc PUBLIC aaa bbb)

PUBLIC后面的库和目标会被链接并成为链接接口的一部分。


1
我尝试了但没成功。如果我正在构建一个共享库,那么.so文件将包含libccc.so中的所有aaa bbb代码。但是如果我切换到静态库,libccc.a将不会有aaa和bbb代码。我正在试图找出问题,并注意到CMAKE_AR可能是一个选择,但我不熟悉它,需要花更多时间学习。 - xyz
1
target_link_library 设置了一些东西,以便任何链接到 ccc 的目标都会自动选择 aaabbb。它们仍然是三个单独的库,但是所有内容都将对从 CMake 中链接到 ccc 的客户端可用。如果您想要其他内容,请描述目标而不是步骤 - legalize

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接