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

Also available as: JSON · Markdown · 中文
95%Fix Rate
85%Confidence
1Evidence
2024-03-05First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
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-libraries

Workarounds

  1. 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
  2. 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)

中文步骤

  1. add_library(myobjlib OBJECT src1.cpp src2.cpp)
    add_library(mylib STATIC)
    target_link_libraries(mylib PRIVATE myobjlib)  # Correct
  2. 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:

  1. 70% fail

    This changes the build semantics and may break object-like usage (e.g., no separate compilation units).

  2. 100% fail

    CMake explicitly rejects PUBLIC/INTERFACE for OBJECT libraries; it will always error.