c ++ - 项目,比方说,foo
由cmake维护.一个人想要创建一个库libfoo.a
(在整个源代码树中创建所有类/方法/函数),以便创建可以链接到库的程序-lfoo
.
好的,让我们现在考虑一个玩具的例子,而且这个问题很清楚.目录foo
(项目的根目录)包含目录a
,和b
.CmakeLists.txt
创建了两个:
# a/CMakeLists.txt
add_library(A <a_sources>)
# b/CMakeLists.txt
add_library(B <b_sources>)
Run Code Online (Sandbox Code Playgroud)
一个CMakeLists.txt
用于根目录:
add_subdirectory(a)
add_subdirectory(b)
add_library(foo <foo_sources>
target_link_libraries(foo A B)
Run Code Online (Sandbox Code Playgroud)
这对我是一个惊喜:建设libfoo.a包含foo_sources唯一方法后,和a_sources
,b_sources
被排除在外.在创建可执行文件cmake的"猜测"是:当可执行文件的建立是在同一个项目中的情况下确定a
和b
如果它与必须链接foo
.但是在可执行文件创建"外部"项目的情况下使用库foo
必须链接-lfoo -la -lb
,现在想象一个有很多子目录的项目 - 如何处理它?所以问题是"如何创建一个库,通过cmake的方式聚合整个项目的方法?"
谷歌搜索引导我到最近嵌入(出现在2.8.8)的OBJECT library
机会.这里显示了使用它的好例子.现在上面的问题可以解决:
# 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>)
Run Code Online (Sandbox Code Playgroud)
问题似乎解决了,不幸的是,并不完全.
例如,如果依赖链长于2,foo
依赖于A
,依赖于B
,问题仍然存在.那是因为,
对象库可能只包含编译为目标文件的源(和标头).
和
无法导入,导出,安装或链接对象库.
(报价取自同一链接)
我试过的几种组合target_link_library()
,add_library(), add_library(... OBJECT ..)
试图链接A
,并B
以foo
没有成功(在cmake的进程的错误.)
我必须放松一些简单的东西,请帮忙,谢谢!我不确定它是否重要:项目是在linux上维护的.
我认为你对“依赖”这个词感到困惑。如果您正在构建一个名为 的库,foo
并且它有两个部分A
和,则是否依赖B
并不重要;该库应该包含两者。您显示的 CMake 代码将正确构建。A
B
foo
归档时间: |
|
查看次数: |
2720 次 |
最近记录: |