CMake 目标文件后缀
在 CMake 里,生成的目标文件(object files)的命名方式通常是:
<源文件名>.CMakeFiles/<target>.dir/<路径>/<源文件名>.c.o
也就是说:
- 后缀是
.o
(在 Linux/Unix 下,Windows 下是.obj
)。 - 文件名的规则是 源文件名 +
.o
,并且如果是 C 文件,会变成xxx.c.o
。
例如:
- 源文件:
src/aaa.c
- 目标名:
myapp
CMake 编译时会生成类似:
CMakeFiles/myapp.dir/src/aaa.c.o
关键点:
- 确实是
.c.o
这种形式,CMake 会把源文件的扩展名也保留在前面。 - 如果是 C++ 文件,比如
bbb.cpp
,就会生成bbb.cpp.o
。
如果你只用 GCC/Make 而不是 CMake,编译 aaa.c
会直接得到 aaa.o
。
但 CMake 为了避免不同扩展名的源文件重名冲突(比如 foo.c
和 foo.cpp
),会保留原始扩展名。
确实是 CMake 自己的规则,而不仅仅是编译器的行为。下面是详细说明:
✅ CMake 是如何决定 object 文件命名的?
-
默认格式
CMake 生成 object 文件时,会保留源文件扩展名,因此通常会生成类似foo.c.o 或 foo.cpp.o
而不是只生成
foo.o
,这样做是为了避免重名冲突(例如foo.c
和foo.cpp
同时存在时)(cmake.org, musteresel.github.io)。 -
设计理念
正如 CMake 内部开发者所述:“object file names are computed in a deterministic manner based only on the source file name and location”
“in order to handle add_executable(foo foo.c foo.cpp) the object name must include the source extension.”
这说明.c.o
、.cpp.o
等这种命名方式是 CMake 特意设计的(cmake.org, CMake Discourse)。 -
定制(不推荐,也不稳定)
如果你真的想改变这个行为,可以设置一些内部变量:set(CMAKE_C_OUTPUT_EXTENSION_REPLACE 1) set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE 1)
不过这些是 未公开的内部变量,未来可能会被移除,不建议依赖(cmake.org, GitLab)。
🧠 而为什么你没有在 Google 上找到相关描述?
- 官方文档并没有专门一节讲 object 文件的具体命名方式(像 foo.c.o 的规则)。
- 这一规则主要出自 CMake 邮件列表讨论,或源码注释,而不在用户文档里系统说明,所以不容易搜到。
📌 小结说明
项目 | 说明 |
---|---|
默认生成的后缀 | .c.o , .cpp.o , .cc.o 等 |
目的与原因 | 避免不同扩展同名冲突 |
是否 CMake 规则 | 是,由 CMake 本身决定 |
改变方式(不推荐) | 设置 CMAKE_C[_CXX]_OUTPUT_EXTENSION_REPLACE = 1 (内部变量) |
总的来说,CMake 默认策略是保留源扩展名并附 .o
,即 "aaa.c.o"
、 "bbb.cpp.o"
这类命名。这个规则主要出现在邮件列表和源码中,而非官方用户文档,所以在网页搜索中不容易找到。
如果你想控制这种命名,可以尝试内部变量,但需注意未来兼容性风险。有其他想深入了解的 CMake 特性也欢迎继续问!