cmake
build_error
ai_generated
true
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%Fix Rate
85%Confidence
1Evidence
2024-03-05First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| CMake 3.20 | active | — | — | — |
| CMake 3.21 | active | — | — | — |
| CMake 3.22 | active | — | — | — |
Root Cause
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.
generic中文
CMake 中的 OBJECT 库只能在 target_link_libraries 的 PRIVATE 作用域中使用;使用 PUBLIC 或 INTERFACE 违反了对象库不可导出的特性。
Official Documentation
https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#object-librariesWorkarounds
-
95% success add_library(myobjlib OBJECT src1.cpp src2.cpp) add_library(mylib STATIC) target_link_libraries(mylib PRIVATE myobjlib) # Correct
add_library(myobjlib OBJECT src1.cpp src2.cpp) add_library(mylib STATIC) target_link_libraries(mylib PRIVATE myobjlib) # Correct
-
80% success add_library(myobjlib STATIC src1.cpp src2.cpp) # Change to STATIC target_link_libraries(mylib PUBLIC myobjlib)
add_library(myobjlib STATIC src1.cpp src2.cpp) # Change to STATIC target_link_libraries(mylib PUBLIC myobjlib)
中文步骤
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)
Dead Ends
Common approaches that don't work:
-
70% fail
This changes the build semantics and may break object-like usage (e.g., no separate compilation units).
-
100% fail
CMake explicitly rejects PUBLIC/INTERFACE for OBJECT libraries; it will always error.