Cmake:使用导入的对象

del*_*ver 5 c++ makefile cmake

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


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

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

bar.o:
    cp $(EXTERNAL_DIR)/bar.o .
Run Code Online (Sandbox Code Playgroud)

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

在 Cmake 文档中,这看起来非常简单;导入 .o 文件:

add_library(bar OBJECT IMPORTED GLOBAL)
set_property(TARGET bar PROPERTY IMPORTED_LOCATION ${EXTERNAL_DIR}/bar.o)
Run Code Online (Sandbox Code Playgroud)

并使用它:

add_executable(foo $<TARGET_OBJECTS:bar> foo.cpp) 
Run Code Online (Sandbox Code Playgroud)

但是当构建运行时,我得到了所有应该包含的内容丢失的符号bar.o——并且详细地运行,原因很清楚:Cmake从不将它用于任何用途。它没有在编译器调用中提到,并且在构建目录中进行 grep 操作,也没有在任何生成的 makefile 中提到。

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

我在这里误解了什么?我如何完成此任务(并且无需添加任何内容EXTERNAL_DIR)?

Flo*_*ian 4

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

您应该使用IMPORTED_OBJECTStarget 属性而不是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>),它指定 main 的位置磁盘上的库文件。或者,对于对象库,IMPORTED_OBJECTS( 和IMPORTED_OBJECTS_<CONFIG>) 指定磁盘上对象文件的位置。