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

其他格式: JSON · Markdown 中文 · English
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.

generic

官方文档

https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#object-libraries

解决方案

  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)

无效尝试

常见但无效的做法:

  1. 70% 失败

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

  2. 100% 失败

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