C++ Cmake:使用导入的对象
虽然这是一个非常相似的问题,但它早于我所问的方法(“导入的对象库”),它是在3.9.6~1年前的版本中添加到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目标中 这似乎很
我刚刚开始使用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节)。我想从一年前开始。