cmake
config_error
ai_generated
true
CMake Error: INTERFACE_LIBRARY targets may only have INTERFACE properties. The SOURCES property of target "mylib" is not allowed.
ID: cmake/interface-library-sources-ignored
92%Fix Rate
88%Confidence
1Evidence
2023-03-15First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| CMake 3.10 | active | — | — | — |
| CMake 3.16 | active | — | — | — |
| CMake 3.22 | active | — | — | — |
| CMake 3.27 | active | — | — | — |
Root Cause
Attempting to set source files on an INTERFACE library target, which by definition cannot have compile sources.
generic中文
尝试在 INTERFACE 库目标上设置源文件,而根据定义,INTERFACE 库不能有编译源文件。
Official Documentation
https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#interface-librariesWorkarounds
-
90% success Remove SOURCES from the INTERFACE library. If you need compiled sources, use add_library(mylib STATIC ...) or add_library(mylib SHARED ...) instead.
Remove SOURCES from the INTERFACE library. If you need compiled sources, use add_library(mylib STATIC ...) or add_library(mylib SHARED ...) instead.
-
85% success If you need both interface properties and compiled sources, create two targets: an INTERFACE library for headers and a STATIC/SHARED library for sources, then link them.
If you need both interface properties and compiled sources, create two targets: an INTERFACE library for headers and a STATIC/SHARED library for sources, then link them.
中文步骤
Remove SOURCES from the INTERFACE library. If you need compiled sources, use add_library(mylib STATIC ...) or add_library(mylib SHARED ...) instead.
If you need both interface properties and compiled sources, create two targets: an INTERFACE library for headers and a STATIC/SHARED library for sources, then link them.
Dead Ends
Common approaches that don't work:
-
Adding SOURCES property with set_property(TARGET mylib PROPERTY SOURCES ...) to work around the error
95% fail
INTERFACE libraries are header-only or pure-interface; they have no compiled sources, so setting SOURCES violates the target type.
-
Changing the target type to STATIC or SHARED but keeping the same interface logic
70% fail
Changing target type changes the build semantics; INTERFACE libraries are intended for header-only or transitive dependencies, not compiled code.
-
Deleting the target entirely and re-adding it with sources as a different target
80% fail
This loses the interface propagation properties and may break dependency chains.