码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 服务器正文21:不同编译器对预编译的处理(简单介绍msvc和gcc)


    文章目录

      • 一、背景
      • 二、msvc的预编译头处理
        • 1)总结
        • 2)具体使用
      • 三、gcc的预编译头文件处理
        • 1)gcc搜索stdafx.pch文件路径的规则
        • 2)编译
      • 四、备注(C和C++对于*.h编译的区别)

    一、背景

    • 大部分编译器都支持预编译
      在的大部分c/c++编译器都是支持预编译头的,例如:gcc,clang,msvc等
    • 预编译作用
      用于优化c++代码的编译速度,毕竟c++的头文件如果包含了模板定义的话,编译速度是很慢的
    • 预编译的做法
      能够吧大部分通用的头文件放置在一个header.h中,在其他源码编译之前预先对其进行编译,之后的代码都能重用这部分预编译头,就可以极大程度上减少频繁的头文件冗余编译。

    二、msvc的预编译头处理

    预编译头在msvc的项目中很常见,经常会看到类似stdafx.cpp, stdafx.h的文件,就是用于此目的,而msvc编译器是通过编译stdafx.cpp来生成预编译头文件stdafx.pch的。

    1)总结

    一般同一项目下的stdafx.cpp是创建预编译头(/Yc),其他.cpp文件是使用预编译头(/Yu),所有.h文件不关心这个

    2)具体使用

    • 总体流程预览
      1)创建预编译头命令
      2)其他文件使用这个stdafx.pch的方法
      3)链接obj的注意
      4)与其他编译器的区别

    • 创建预编译头命令

    $ cl.exe -c -Yc -Fpstdafx.pch -Fostdafx.obj stdafx.cpp
    
    1)-Yc就是创建预编译头stdafx.pch
    2)-Fp来指定*.pch的输出文件路径
    3)-Fo指定编译stdafx.cpp生成对象文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 其他文件如何使用这个stdafx.pch?

    通过将stdafx.h传入-Yu来告诉编译器,编译当前代码,忽略#include “stdafx.h”,直接使用已经编译好的stdafx.pch文件。

    cl.exe -c -Yustdafx.h -Fpstdafx.pch -Fotest.obj test.cpp
    
    • 1
    • 最后链接的时候
      需要把:stdafx.obj, test.obj都连接上才行,这个也是和gcc, clang编译器不同的地方。
    link.exe -out:test test.obj stdafx.obj
    
    • 1
    • 其他注意点
      1)注:一定要吧stdafx.obj也链接上哦,虽然stdafx.cpp仅用于生成stdafx.pch,但是对象文件也是需要。
      2)还有个跟gcc, clang有区别的地方是,msvc的-Yu指定stdafx.h必须是#include "stdafx.h"中的头文件名字,不是文件路径哦。

    三、gcc的预编译头文件处理

    1)gcc搜索stdafx.pch文件路径的规则

    1)从stdafx.h所在目录中,查找stdafx.h.pch文件是否存在
    2)从-I的头文件搜索路径找查找stdafx.h.pch
    
    • 1
    • 2

    2)编译

    • 总体流程
    1)编译头文件生成pch文件:
    2)使用预编译头文件:
    
    • 1
    • 2
    • 编译头文件生成pch文件:
    gcc -c -o stdafx.pch stdafx.h
    
    • 1
    • 使用预编译头文件:
    gcc -c -include stdafx.h -o test.o test.cpp
    
    • 1

    四、备注(C和C++对于*.h编译的区别)

    1)gcc、clang对于*.h的头文件编译,默认是作为c预编译头来使用的,这跟c++的pch是不一样的。
    2)*.h的头文件编译无法给c++的代码使用,如果要生成c++可用的pch文件,必须要告诉编译器,如何去编译stdafx.h

    • 方法
      这个可以通过-x c+±header参数来解决:
    gcc -c -x c++-header -o stdafx.pch stdafx.h
    
    • 1
    • 当然也可以通过修改后缀名来解决:
    gcc -c -o stdafx.pch stdafx.hpp
    
    • 1
  • 相关阅读:
    SSM框架的师范学院教务信息查询系统的设计与实现源码
    Docker技术概论(2):Docker环境的搭建
    解决 “编译需要TBBConfig.cmake,但TBB 2020及older版本不生成.cmake文件”的问题
    js(javascript)中页面跳转和窗口关闭等操作
    【6.824】分布式lab1 mapReduce
    痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(12.A)- uSDHC eMMC启动时间(RT1170)
    Canal 实现MySQL与Elasticsearch7数据同步
    【Redis】Redis事务
    基于java的社会公益平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
    npm 安装与配置
  • 原文地址:https://blog.csdn.net/weixin_43679037/article/details/126029894
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号