跳至主要內容

编译详解

LincZero大约 3 分钟

编译详解

编译原理

源文件创建 - 文件扩展名(与C不同)

源代码文件扩展名

C++实现源代码文件的扩展名
UNIXC、cc、cxx、c
GUN C++C、cc、cxx、cpp、c++
Digital Marscpp、cxx
Borland C++cpp
Watcomcpp
Microsoft Visual C++cpp、cxx、cc
Freestyle CodeWarriorcp、cpp、cc、cxx、c++

编译和连接原理

  • C语言编程步骤
  • C++编程步骤(简化版)

编译和连接方式

最初C++使用编译器程序到C,而不是开发直接的C++到目标代码的编译器

前者叫作cfront。后者为C++编译器,加速了编译过程

各平台下的编译

平台方法补充
UNIX自带编译器CC,CC spiffy.C,生成a.out
Linux自带编译器g++,g++ spiffy.cxx,生成a.out
Windows下载命令行编译器,也是用g++编译器,生成a.outCygwinMinGW(相当于弄了个Linux环境,均在命令提示符模式下运行)
Windows下载IDE编译器,生成.exeVC++VS(一般进行项目的创建而非仅仅编译单个文件)
Macintosh开发框架Xcode,Apple官网安装Xcode提功力支持多种语言的IDE和两个命令行解释器(g++和clang)
还可通过Termianl进入UNIX模式

补充

  • 生成可执行代码的过程:先生成目标代码文件spiffy.o,再自动生成可执行文件a.out,并删除目标代码
  • 可执行对象的名字:UNIX和Linux均默认为a.out,再次编译会自动覆盖
  • g++补充:有些版本可能要求连接C++库g++ spiffy.cxx -lg++,编译多个文件g++ my.cxx precious.cxx

补充:说下编译器gcc和g++(与C不同)

gcc和g++都可以编译C/C++,但教程上一般是gcc对C,gcc汇编,g++对C++,具体的这里不再深入

两者的用法几乎完全一致

linux指令(gccobjdump操作生成文件文件补充
gcc main.c编译+汇编+链接?二进制文件a.outsudo ./a.out可运行该文件
gcc -Og -S main.c仅编译汇编文件main.s可以文本方式打开阅读汇编代码
gcc -Og -S -masm=intel main.c仅编译汇编文件main.s还可以生成Intel格式的代码(没区别?)
gcc -Og -c main.c编译+汇编二进制文件main.osudo ./main.o可运行该文件
gcc -Og -o prog main.c hello.c编译+汇编+链接二进制文件progsudo ./prog可运行该文件
————————————————————————
g++ main.cpp编译+汇编+链接?二进制文件a.outsudo ./a.out可运行该文件
g++ -S main.cpp仅编译汇编文件main.s可以文本方式打开阅读汇编代码
g++ -c main.cpp编译+汇编二进制文件main.osudo ./main.o可运行该文件
g++ -o [world] main.cpp编译+汇编+链接二进制文件main (或world)sudo ./prog可运行该文件
————————————————————————
objdump -d mstore.o反汇编二进制代码不生成,在终端显示结果
objdump -d prog反汇编二进制代码不生成,在终端显示结果

表格补充:如进行链接,则必须要有一个main函数