学习记录:gcc/g++ 编译与链接

gcc/g++ 编译与链接

编译与链接的过程可以分解为四个步骤:预处理、编译、汇编、链接

  • 预处理:源代码文件和相关的头文件,被预处理器cpp预处理成一个后缀为 .i 的文件(选项:-E
  • 编译:把预处理完的文件进行一系列的词法分析、语法分析、语义分析以及优化后,产生相应的汇编代码文件,后缀为 .s,(选项 :-S
  • 汇编:把编译阶段生成的 .s 文件转成二进制目标代码,后缀为.o,(选项:-c
  • 链接:把每个源代码模块独立地编译,然后按照要将它们“组装”起来。链接的主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正常的衔接,生成最终可执行文件

例子:

pintA.h

#ifndef __PRINTA_H_
#define __PRINTA_H_

void printA();

#endif

printA.cpp

#include "printA.h"
#include <stdio.h>
void printA()
{
    printf("I am A.\n");
}

printB.h

#ifndef __PRINTB_H_
#define __PRINTB_H_

void printB();

#endif

printB.cpp

#include "printB.h"
#include <stdio.h>
void printB()
{
    printf("You are B.\n");
}

语法:

g++ 选项 source -o target
  • source 为待处理文件,-o 后的 target 是目标文件,g++ 选项、source的文件后缀、 target的文件后缀要注意对应

预处理:

g++ -E printA.cpp -o printA.i
g++ -E printB.cpp -o printB.i

编译:

g++ -S printA.i -o printA.s
g++ -S printB.i -o printB.s

汇编:

g++ -c printA.s -o printA.o
g++ -c printB.s -o printB.o

链接:

g++ main.cpp printA.o printB.o -o main

运行

./main

输出结果:

I am A.

You are B.

参考:《后台开发核心技术与应用实践》

原文地址:https://www.cnblogs.com/pz-Feng/p/8284121.html

时间: 2024-07-31 16:00:11

学习记录:gcc/g++ 编译与链接的相关文章

gcc g++编译时警告:&quot;xxxx&quot; 将随后被初始化_解决方法

gcc g++编译时警告:  "xxxx" 将随后被初始化: 这个问题的原因是在构造函数里,如果你在构造函数中初始化变量时,用的是初始化列表的方式,则初始化列表中的成员变量初始化顺序要和类定义时的变量顺序一致.

Windows Sublime Text 配置Linux子系统(WSL)下的 gcc/g++ 编译环境

0. 简介(若已了解背景可以跳过此部分) Windows 10 Build 14316以上版本中加入了"Windows系统的Linux子系统"(Windows Subsystem for Linux,以下简称WSL)功能,这是一个完整的Linux系统.Sublime Text是一个迅速并且功能强大代码编辑器.现在网上大多数关于Sublime Text配置gcc/g++编译环境的教程都是用MinGW之类的工具,这里来讲讲如何使用WSL来创建原汁原味的gcc/g++编译环境. 1. 安装W

gcc/g++编译(生动形象,从最容易入手的hello world解释了库的概念)

1. gcc/g++在执行编译工作的时候,总共需要4步 (1).预处理,生成.i的文件[预处理器cpp] (2).将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs] (3).有汇编变为目标代码(机器代码)生成.o的文件[汇编器as] (4).连接目标代码,生成可执行程序[链接器ld] [参数详解] -x language filename    设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很

gcc/g++编译(转)

1. gcc/g++在执行编译工作的时候,总共需要4步 (1).预处理,生成.i的文件[预处理器cpp] (2).将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs] (3).有汇编变为目标代码(机器代码)生成.o的文件[汇编器as] (4).连接目标代码,生成可执行程序[链接器ld] [参数详解] -x language filename    设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很

linux下使用gcc/g++编译代码时gets函数有错误

今天在linux中使用个g++编译一个名为myfirst.cpp的代码的时候,出现如下错误 myfirst.cpp: In function ‘int main()’:myfirst.cpp:11:2: warning: ‘char* gets(char*)’ is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations] gets(cc); ^myfirst.cpp:11:9: warning:

gcc/g++ 编译时出现:“对’xxxx’未定义的引用,collect2: error: ld returned 1 exit status” 的错误

出现的问题: 在使用 make 编译实现一个程序时,出现了下面的错误.查看程序源文件所在的目录时发现程序已经完成了编译,并生成了 list_repo.o 的文件,说明是在程序链接生成可执行文件时发生了问题. storages/local.o:在函数‘LocalStorage::init(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >,

使用gcc -g编译,gdb调试时仍然存在“no debug symbols found”的错误

今天为调试一段代码,使用gcc将程序用-g选项重新编译.但是使用gdb进行debug时,仍然出现“no debug symbols found”的错误.仔细检查了一下Makefile,原来后面定义的连接选项中指定了-s.gcc的文档中说明如下: -sRemove all symbol table and relocation information from the executable. 去掉-s后,可以用gdb进行调试了

gcc g++支持C++11 标准编译及其区别

g++ -g -Wall -std=c++11 main.cpp gcc -g -Wall -std=c11 main.cpp 如果不想每次写这个-std=C++11这个选项该怎么办呢? 方法出处:http://stackoverflow.com/questions/16886591/how-do-i-enable-c11-in-gcc 方法1:写Makefile 方法2:取别名 :alias g++11="g++ -std=c++11" -----------------------

GCC G++ 的区别

gcc 是c的编译器,g++是c++的编译器.cc一般是一个符号连接,指向gcc. CC一般是makefile里面的一个名字,具体是什么根据实际情况决定. gcc和g++都是GNU(组织)的一个编译器. 误区一:gcc只能编译c代码,g++只能编译c++代码 两者都可以,但是请注意: 1,后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的.C++的语法规则更加严谨一些. 2,编译阶