C++ Cmake:使用导入的对象

C++ Cmake:使用导入的对象,c++,makefile,cmake,C++,Makefile,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目标中 这似乎很

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


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

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

bar.o:
    cp $(EXTERNAL_DIR)/bar.o .
因此,
bar.o
只是从外部复制进来的。它没有被构建,等等。然后它被编译到
foo
目标中

这似乎很简单;要导入.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) 
add_可执行文件(foo$foo.cpp)
但是,当构建运行时,我会得到所有缺少的符号,这些符号应该在
bar.o
中,然后详细地运行,原因很清楚:Cmake从不将其用于任何事情。编译器调用中没有提到它,在生成目录中也没有提到它

此外,我可以将
导入的\u位置
更改为不存在的位置,它不在乎。它的运行方式完全相同

我在这里误解了什么?我如何才能做到这一点(并且不必向
外部目录添加任何内容?

您所需要的就是:

add_executable(foo foo.cpp ${EXTERNAL_DIR}/bar.o) 
作为将来的参考,CMake文档的
添加库(…对象)
说明:

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


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

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

您应该使用目标属性,而不是
IMPORTED\u LOCATION

见:

最重要的此类属性是[
IMPORTED_LOCATION
}()(及其每个配置变量),它指定主库文件在磁盘上的位置。或者,对于对象库,(and)指定对象文件在磁盘上的位置


可能只是一个提示的重复:“链接”部分不再适用于。@Florian:CMake 3.12甚至还没有发布。我给出的解决方案很简单,适用于所有版本。实际上,它看起来像是3.9.6+(在“导入库”的概要中,对象显示为该版本的一个选项),并且它确实可以使用导入的对象,而不是这里的位置(3.11节)。我想从一年前开始。