c++ - 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 文档中,这看起来很简单;导入 .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
)?
解决方案
您的方法看起来不错,但有一个明显的例外(CMake 的文档在此处不清楚,将在 CMake 的下一个版本中修复;请参阅Merge Request !2216)。
您应该使用IMPORTED_OBJECTS
目标属性而不是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>
),它指定了主要的位置磁盘上的库文件。或者,对于对象库,IMPORTED_OBJECTS
(andIMPORTED_OBJECTS_<CONFIG>
) 指定对象文件在磁盘上的位置。
推荐阅读
- python - 为颜色数据实现萤火虫算法
- javascript - 有没有办法在不打开 Outlook 或 Apple Mail 的情况下使用 CSS(或任何与 Web 开发相关的语言)中的“mailto”立即发送电子邮件?
- python - 如何在 Linux 上访问环境变量值 Python?
- regex - 使用 perl 插入可能丢失的行
- git - 删除(意外)和重新定位本地仓库(Git)后无法推送到 Heroku
- visual-studio - 在 Visual Studio Pro 2017 中启动 Azure Function 时出错
- kotlin - 使用 webflux 进行上下文日志记录(标头中的关联 ID)
- android - 在 Xamarin.Android 中使用新的 Google Place API 创建自定义地点选择器
- rust - 宏扩展忽略标记 `let` 和任何后续
- c++ - Visual Studio Code C/C++ Extension 没有为编译器设置包含路径