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)?
您的方法看起来不错,但有一个值得注意的例外(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>) 指定磁盘上对象文件的位置。