gpt4 book ai didi

c++ - Cmake:使用导入的对象

转载 作者:行者123 更新时间:2023-11-30 02:19:02 26 4
gpt4 key购买 nike

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


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

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

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

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

In the Cmake documentation这看起来很简单;导入 .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 添加任何内容)?

最佳答案

你的方法看起来不错,但有一个明显的异常(exception)(CMake 的文档在这里不清楚,将在 CMake 的下一个版本中修复;参见 Merge Request !2216)。

你应该使用 IMPORTED_OBJECTS 目标属性而不是 IMPORTED_LOCATION .

参见 https://cmake.org/cmake/help/git-stage/command/add_library.html#imported-libraries :

The most important such property is [IMPORTED_LOCATION}(https://cmake.org/cmake/help/git-stage/prop_tgt/IMPORTED_LOCATION.html#prop_tgt:IMPORTED_LOCATION) (and its per-configuration variant IMPORTED_LOCATION_<CONFIG>) which specifies the location of the main library file on disk. Or, for object libraries, IMPORTED_OBJECTS (and IMPORTED_OBJECTS_<CONFIG>) specifies the locations of object files on disk.

关于c++ - Cmake:使用导入的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51344020/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com