【问题标题】:Cmake: Use imported objectCmake:使用导入的对象
【发布时间】:2018-07-14 22:59:09
【问题描述】:

虽然this duplicate 是一个非常相似的问题,但它早于我所询问的方法(“导入的对象库”),它是在 3.9.6 版 ~1 年前添加到 Cmake 中的(?)因此那里的答案都没有解决这个问题。


我刚刚开始使用 cmake,我正试图或多或少地从 makefile 中复制这种行为:

foo: foo.cpp bar.o
    $(CXX) $^ -o $@

bar.o:
    cp $(EXTERNAL_DIR)/bar.o .

所以bar.o 只是从外部复制进来的。它没有被构建,等等。然后它被编译到foo目标中。

In the Cmake documentation 这看起来很简单;导入 .o 文件:

add_library(bar OBJECT IMPORTED GLOBAL)
set_property(TARGET bar PROPERTY IMPORTED_LOCATION ${EXTERNAL_DIR}/bar.o)

并使用它:

add_executable(foo $<TARGET_OBJECTS:bar> foo.cpp) 

但是当构建运行时,我得到了所有应该在bar.o 中的东西的缺失符号——并且运行冗长,原因很清楚:Cmake 从不将它用于任何事情。在编译器调用中没有提到它,并且在构建目录中没有提到它,在任何生成的 makefile 中也没有提到它。

此外,我可以将IMPORTED_LOCATION 更改为不存在的东西,它并不在乎。它的运行方式完全相同。

我在这里误解了什么?我如何完成这项工作(无需向EXTERNAL_DIR 添加任何内容)?

【问题讨论】:

标签: c++ makefile cmake


【解决方案1】:

您的方法看起来不错,但有一个明显的例外(CMake 的文档在此处不清楚,将在 CMake 的下一个版本中修复;请参阅 Merge Request !2216)。

您应该使用IMPORTED_OBJECTS 目标属性而不是IMPORTED_LOCATION

https://cmake.org/cmake/help/git-stage/command/add_library.html#imported-libraries:

最重要的此类属性是 [IMPORTED_LOCATION}(https://cmake.org/cmake/help/git-stage/prop_tgt/IMPORTED_LOCATION.html#prop_tgt:IMPORTED_LOCATION)(及其每个配置的变体IMPORTED_LOCATION_&lt;CONFIG&gt;),它指定了主库文件在磁盘上的位置。或者,对于对象库,IMPORTED_OBJECTS(和IMPORTED_OBJECTS_&lt;CONFIG&gt;)指定对象文件在磁盘上的位置。

【讨论】:

    【解决方案2】:

    你只需要这个:

    add_executable(foo foo.cpp ${EXTERNAL_DIR}/bar.o) 
    

    为了将来参考,add_library(... OBJECT) 的 CMake 文档说:

    无法导入、导出、安装或链接对象库。

    这部分解释了为什么您的原始方法不起作用。

    【讨论】:

    • 只是一个提示:CMake version >= 3.12 的“链接”部分不再正确。
    • @Florian:CMake 3.12 甚至还没有发布。我给出的解决方案很简单,适用于所有版本。
    • 实际上它看起来像是 3.9.6+(在“导入库”下的概要中,OBJECT 显示为该版本的一个选项),并且它使用 IMPORTED_OBJECTS 而不是 @987654326 确实有效@ 此处(第 3.11 节)。我想是一年前的this is the commit
    猜你喜欢
    • 2011-03-02
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多