Linux 下 GCC 的使用
0 运行环境
本机系统:Windows 7
虚拟机软件:Oracle VM VirtualBox 6
虚拟机系统:CentOS 7
1 GCC 简介
GCC 是 GUN Compiler Collection的缩写,可以支持多种语言编译,比如 C,C++,Java,pascal 等。
2 GCC 常用选项
-o:生成目标
-E:激活预处理。生成预处理文件( .i 文件)
-S:激活预处理、编译。生成汇编代码( .s 文件)
-c:激活预处理、编译、汇编。生成目标文件( .o 文件)
-Wall:打开编译警告
-g:包含调试信息
-llib:链接 lib 库
-I:指定头文件目录
-Idir:增加 include 目录(头文件路径)
-LDir:增加 lib 目录(编译静态库和动态库)
3 GCC 编译
3.0 示例代码
示例程序如下:
//hello.c
#include <stdio.h>
int main(void)
{
printf("Hello World!\n");
return 0;
}
vim 编辑器中的代码:
当前所在的位置:
3.1 四个过程
3.1.1 预处理
编译器将 C 源代码中的包含的头文件如stdio.h编译进来,替换宏。
gcc -E hello.c -o hello.i
3.1.2 编译
GCC 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,GCC 把代码翻译成汇编语言。
gcc –S hello.i –o hello.s
3.1.3 汇编
把编译阶段生成的 ”.s” 文件转成二进制目标代码。
gcc –c hello.s –o hello.o
3.1.4 链接
链接到库中,生成可执行文件。
gcc hello.o –o hello
3.2 一次性完成
输入命令 gcc hello.c -o hello
,如下图所示:
运行编译后的可执行程序 ./hello
,如下图所示:
4 多个文件的编译方法
现在有 3 个文件,分别是 main.c,print.c,print.h
main.c 如下所示:
// main.c
#include "print.h"
int main(void)
{
print();
return 0;
}
print.c 如下所示:
// print.c
#include <stdio.h>
void print(void)
{
printf("you have done well !\n");
}
print.h 如下所示:
// print.h
void print();
4.1 假如头文件和源文件都在一个目录下
4.1.1 多个文件一起编译
在 shell 中输入:
gcc print.c main.c -o main_print
如下所示:
4.1.2 分别编译各个源文件,再对编译后输出的目标文件(.o)链接
在 shell 中输入:
gcc -c print.c -o print.o
gcc -c main.c -o main.o
gcc print.o main.o -o main_print
如下所示:
4.2 假如头文件和源文件不在一个目录下
源文件所在目录:
头文件在 myInclude 目录下:
在 shell 中输入,主要是要加 -I 指定头文件目录
gcc print.c main.c -o main_print -I myInclude
运行截图:
Linux 下 GCC 的使用的更多相关文章
- Linux下gcc与gdb简介
gcc编译器可以将C.C++等语言源程序.汇编程序编译.链接成可执行程序.gdb是 GNU 开发的一个Unix/Linux下强大的程序调试工具. linux下没有后缀名的概念.但 gcc 根据文件的后 ...
- Linux下Gcc生成和使用静态库和动态库详解(转)
一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...
- linux下gcc编译多个源文件、gdb的使用方法
一. gcc常用编译命令选项 假设源程序文件名为test.c. 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理.汇编.编译并链接形成可执行文件.这里未指定输出文件,默认 ...
- Linux下Gcc生成和使用静态库和动态库详解
参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...
- Linux下GCC的使用
1简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective ...
- linux下gcc编译的参数详细说明
参考网址:1 http://hi.baidu.com/zengzhaonong/item/f1f9383565fa5c302e0f8125 gcc使用方法 汇总 2 http://s99f.blog. ...
- Linux下gcc编译生成动态链接库*.so文件并调用它【转载】
动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一 ...
- Linux下gcc编译生成动态链接库*.so文件并调用它 是转载的
动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一 ...
- Linux下gcc编译生成动态链接库*.so文件并调用它
动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一 ...
- 【转】Linux下gcc生成和使用静态库和动态库详解
一.基本概念 1.1 什么是库 在Windows平台和Linux平台下都大量存在着库. 本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不 ...
随机推荐
- dict, hash
dict: dictKey -- > dictVal example: dictEntry *dictFind(dict *d, const void *key) Key is like ...
- day49 Pyhton 数据库Mysql 06
多表查询 连表查询 要进行连接,那一定涉及两个表,两个表中要有关联条件才能进行连接 内连接 只有表一和表二中的连接条件都满足的时候才能显示出来 inner join on /where 条件 sele ...
- 单源文件目录makefile
目录结构 由于只是用来编译简单的小型程序,所以目录尽量简洁: . ├── build │ ├── bin │ ├── .dep │ └── obj ├── makefile └── src ...
- doker基本使用
Docker与虚拟机的区别 docker和虚拟机最大的不同,docker共用宿主机的内核,虚拟机中每个虚拟机中有单独的内核虚拟出来,如上图所示: docker不能做后端兼容性测试,因为其没有独立的虚拟 ...
- 第三十六章 Linux常用性能检测的指令
作为一个Linux运维人员,介绍下常用的性能检测指令! 一.uptime 命令返回的信息: 19:08:17 //系统当前时间 up 127 days, 3:00 ...
- 缩略图调查——抖音客户端/PC/iphone
最近对抖音有点上瘾,经常看到这样的视频列表: 由于抖音平台的限制,用户最多只能上传60s的视频,因此分段为3个视频.而在视频列表的缩略图模式下,三个视频的封面恰好组合成一张图像.这种方式比较符合审美标 ...
- frida框架hook获取方法输出参数(常用于简单的so输出参数获取,快速开发)
一.模板 function douyinencode(data) { var result = {}; Java.perform(function () { try { var Test = Java ...
- I-Isolated Pointset
题意:给定T组数据,每组数据有一个数n,表示点集的个数,问是否存在一个点数为n的点集,使得任意两个点组成的边的垂直平分线过点集中的第三个点 本题非常巧妙,只需构造一个由(n-2)个相同共点(圆心)等边 ...
- 12 个设计 API 的安全建议,不要等出事儿了“捶胸顿足”
原文地址:API Security Best Practices 原文作者:Mark Michon 译者 & 校正:HelloGitHub-小鱼干 & HelloGitHub-鸭鸭 虽 ...
- vue项目 封装api
设计思路 为了加强项目的可维护性,建议将请求接口api进行统一封装, 一个常规项目的基础地址一般为唯一,所以考虑将基础地址设定一个变量 let baseUrl: "xxxxxx" ...