首页 > 解决方案 > Cmake:使用导入的对象

问题描述

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


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

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

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

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

在 Cmake 文档中,这看起来很简单;导入 .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++makefilecmake

解决方案


您的方法看起来不错,但有一个明显的例外(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_<CONFIG>),它指定了主要的位置磁盘上的库文件。或者,对于对象库,IMPORTED_OBJECTS(and IMPORTED_OBJECTS_<CONFIG>) 指定对象文件在磁盘上的位置。


推荐阅读