当前位置: 首页 > java >正文

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.cfoo.cpp),会保留原始扩展名。


确实是 CMake 自己的规则,而不仅仅是编译器的行为。下面是详细说明:


✅ CMake 是如何决定 object 文件命名的?

  1. 默认格式
    CMake 生成 object 文件时,会保留源文件扩展名,因此通常会生成类似

    foo.c.o   或   foo.cpp.o
    

    而不是只生成 foo.o,这样做是为了避免重名冲突(例如 foo.cfoo.cpp 同时存在时)(cmake.org, musteresel.github.io)。

  2. 设计理念
    正如 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)。

  3. 定制(不推荐,也不稳定)
    如果你真的想改变这个行为,可以设置一些内部变量:

    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 特性也欢迎继续问!

http://www.xdnf.cn/news/16584.html

相关文章:

  • react 项目怎么打断点
  • 大规模矩阵构建与高级算法应用
  • 【Linux篇】补充:消息队列和systemV信号量
  • 为什么分类任务偏爱交叉熵?MSE 为何折戟?
  • 【C++】判断语句
  • 网络数据传输与NAT技术的工作原理
  • 智能体安全与可信AI:防护机制与伦理考量
  • 代码随想录Day32:动态规划(斐波那契数、爬楼梯、使用最小花费爬楼梯)
  • 代码随想录算法训练营第三十三天
  • 力扣 之 最小覆盖子串(变长滑动窗口,越短越好)
  • 历史版本的vscode下载地址
  • 数据处理工具是做什么的?常见数据处理方法介绍
  • C++ 哈希算法、贪心算法
  • Android15广播ANR的源码流程分析
  • Linux系统Centos7 安装mysql5.7教程 和mysql的简单指令
  • rhel9.1配置本地源并设置开机自动挂载(适用于物理光驱的场景)
  • 在 Windows 系统 下直接使用了 Linux/macOS 的环境变量设置语法 PLATFORM=android
  • 图像处理第三篇:初级篇(续)—— 照明的理论知识
  • 问题大全【1】
  • Ansible提权sudo后执行报错
  • STM32——寄存器映射
  • Day22-二叉树的迭代遍历
  • NAS远程访问新解法:OMV与cpolar的技术协同价值
  • 浏览器安全演进:从裸指针到 raw_ptr 的实践与思考
  • QGIS基于规则的道路分级制图及Leaflet集成展示实例
  • 日志分析-windows日志分析base--笔记ing
  • 数论1.01
  • 【实时Linux实战系列】在实时应用中进行负载均衡
  • Python day27
  • 【硬件】LVGL