cmake
build_error
ai_generated
true
CMake 错误:OBJECT 库目标 "myobjlib" 不能与关键字 "PUBLIC" 或 "INTERFACE" 一起用于 target_link_libraries。
CMake Error: OBJECT library target "myobjlib" may not be used in target_link_libraries with keyword "PUBLIC" or "INTERFACE".
ID: cmake/object-library-link-error
95%修复率
85%置信度
1证据数
2024-03-05首次发现
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| CMake 3.20 | active | — | — | — |
| CMake 3.21 | active | — | — | — |
| CMake 3.22 | active | — | — | — |
根因分析
CMake 中的 OBJECT 库只能在 target_link_libraries 的 PRIVATE 作用域中使用;使用 PUBLIC 或 INTERFACE 违反了对象库不可导出的特性。
English
OBJECT libraries in CMake are only allowed in PRIVATE scope of target_link_libraries; using PUBLIC or INTERFACE violates the object library's non-exportable nature.
官方文档
https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#object-libraries解决方案
-
add_library(myobjlib OBJECT src1.cpp src2.cpp) add_library(mylib STATIC) target_link_libraries(mylib PRIVATE myobjlib) # Correct
-
add_library(myobjlib STATIC src1.cpp src2.cpp) # Change to STATIC target_link_libraries(mylib PUBLIC myobjlib)
无效尝试
常见但无效的做法:
-
70% 失败
This changes the build semantics and may break object-like usage (e.g., no separate compilation units).
-
100% 失败
CMake explicitly rejects PUBLIC/INTERFACE for OBJECT libraries; it will always error.