gpt4 book ai didi

linux - 使用 cmake 从整个项目创建一个静态库

转载 作者:IT王子 更新时间:2023-10-29 00:35:07 24 4
gpt4 key购买 nike

c++-project,例如,foo 由 cmake 维护。人们想要创建一个库 libfoo.a(在整个源代码树中创建所有类/方法/函数),以便创建可以使用 -lfoo< 链接到库的程序.

好的,现在让我们考虑一个玩具示例,问题会很清楚。目录 foo(项目的根目录)包含目录 ab。创建了两个 CmakeLists.txt:

# a/CMakeLists.txt
add_library(A <a_sources>)
# b/CMakeLists.txt
add_library(B <b_sources>)

还有一个 CMakeLists.txt 用于根目录:

add_subdirectory(a)
add_subdirectory(b)
add_library(foo <foo_sources>
target_link_libraries(foo A B)

这让我感到惊讶:在构建 libfoo.a 后仅包含来自 foo_sources 的方法,并且 a_sourcesb_sources 被排除在外。在使用同一项目构建可执行文件的情况下,这是可以的:在创建可执行文件时,cmake“猜测”ab 如果链接到 则必须链接>富。但是如果可执行文件是在“外部”项目中创建的,以使用库 foo 必须与 -lfoo -la -lb 链接,现在想象一个有很多子目录的项目 - 如何处理它?所以问题是“如何创建一个库,使用 cmake 聚合整个项目的方法?”

谷歌搜索让我找到了最近嵌入(出现在 2.8.8 中)OBJECT 库 的机会。显示了使用它的好例子 here .现在上面的问题可以这样解决:

# a/CMakeLists.txt
add_library(A OBJECT <a_sources>)
# b/CMakeLists.txt
add_library(B OBJECT <b_sources>)
# foo/CMakeLists.txt
add_subdirectory(a)
add_subdirectory(b)
add_library(foo <foo_sources> $<TARGET_OBJECTS:A> $<TARGET_OBJECTS:B>)

问题似乎已经解决,不幸的是,并没有完全解决。

如果依赖链大于2,比如foo依赖AA又依赖B,问题依旧。那是因为,

Object libraries may contain only sources (and headers) that compile to object files.

Object libraries cannot be imported, exported, installed, or linked.

(引号取自相同的 link )

我尝试了 target_link_library()add_library()、add_library(... OBJECT ..) 的几种组合,试图链接 ABfoo 没有成功(在 cmake 过程中出错。)

我一定是失去了一些简单的东西,请帮忙,谢谢!我不确定它是否重要:项目在 linux 上维护。

最佳答案

我认为您对“取决于”一词感到困惑。如果你正在构建一个名为 foo 的库并且它有两部分,AB,那么 A 是否无关紧要 依赖于B;图书馆应该包含两者。您显示的 CMake 代码将正确构建 foo

关于linux - 使用 cmake 从整个项目创建一个静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13662474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com