CMake 错误:add_library 无法创建目标 "mylib",因为已存在同名目标。
CMake Error: add_library cannot create target "mylib" because another target with the same name already exists.
ID: cmake/target-already-exists
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| cmake 3.22 | active | — | — | — |
| cmake 3.28 | active | — | — | — |
| cmake 3.30 | active | — | — | — |
根因分析
在同一目录范围内重复定义了同名目标,通常是由于重复的 add_library 或 add_executable 调用,或子目录中目标名称拼写错误。
English
A target with the same name is defined twice in the same directory scope, typically due to duplicate add_library or add_executable calls, or a misspelled target name in a subdirectory.
官方文档
https://cmake.org/cmake/help/latest/command/add_library.html解决方案
-
Ensure each target has a unique name across all subdirectories. Use `add_library(mylib STATIC src/mylib.cpp)` only once. If needed, use `set_target_properties` to alias or create an INTERFACE library with a different name.
-
If the duplicate is intentional (e.g., from FetchContent), wrap in `if(NOT TARGET mylib)` before definition: if(NOT TARGET mylib) add_library(mylib STATIC src/mylib.cpp) endif()
无效尝试
常见但无效的做法:
-
60% 失败
The real cause is a duplicate definition; renaming may hide the issue but the original duplicate remains, causing other targets to reference the wrong one.
-
90% 失败
The error is in CMakeLists.txt logic, not cached state; clearing cache does not fix duplicate target definitions.
-
100% 失败
target_compile_definitions does not create or rename targets; it only adds compile definitions to existing targets.