实验4:UNIX gcc编译器的使用与编程环境
gcc 编译器命令总结

gcc 编译器命令总结1. 三种常用格式i.gcc C源文件-o 目标文件名。
ii.gcc -o 目标文件名C源文件。
iii.gcc C源文件。
(目标文件名默认为:a.out)2. gcc 支持的一些源文件的后缀.c C语言源代码文件。
.a 是由目标文件构成的档案库文件。
.C .cc 或.cxx 是C++ 源代码文件。
.h 是程序所包含的头文件。
.i 是已经预处理过的C源代码文件。
.ii 是已经预处理的C++源代码文件。
.m 是Objective-C源代码文件。
.o 是编译后的目标文件。
.s 是汇编语言源代码文件。
.S 是经过预处理的汇编语言源代码文件。
3.gcc 常用参数-c 只激活预处理,编译和汇编,也就是只把程序做成obj文件。
-S 只激活预处理和编译,就是把文件编译成汇编代码。
-E 只激活预处理,不生成文件,需要把它重定向到一个输出文件里面。
-g 在可执行文件中包含调试信息。
-v 显示gcc 版本信息。
-o file 把输出文件输出到文件中。
-I dir 在头文件的搜索路径中添加dir 目录。
-L dir 在库文件的搜索路径列表中添加dir目录。
-static 链接静态库。
-library 连接名为library的库文件。
4.例子实质上,上述编译过程是分为四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和连接(Linking)。
4.1 示例程序如下:#include <stdio.h>int main(void){printf("Hello World!\n");return 0;}这个程序,一步到位的编译指令是:gcc test.c -o test该命令结束后,在文件目下生成(可执行文件)test通过./test 可运行本程序。
4.2 预处理gcc -E test.c -o test.i 或gcc -E test.c可以输出test.i文件中存放着test.c经预处理之后的代码。
C语言的编译器与调试器使用

C语言的编译器与调试器使用在学习和开发C语言程序时,编译器和调试器是我们必不可少的工具。
编译器负责将源代码转换为机器代码,而调试器则用于调试和解决程序中的bug。
本文将介绍C语言编译器和调试器的使用方法和技巧。
1. C语言编译器1.1 编译器的作用编译器是一个将高级语言(如C语言)源代码转换为低级语言(如汇编语言或机器代码)的工具。
它执行词法分析、语法分析和代码生成等操作,最终生成可执行文件或目标文件。
1.2 常用的C语言编译器•GCC:GNU C Compiler是一个开源的C语言编译器,被广泛用于多种操作系统和平台。
•Clang:是一个基于LLVM的C语言编译器,具有良好的性能和代码生成优化。
•Visual Studio:是微软公司开发的IDE,内置了C和C++编译器。
1.3 编译C程序的步骤编译C程序的主要步骤包括:预处理、编译、汇编和链接。
1. 预处理:将源代码中的宏定义、条件编译等处理成标准的C代码。
2. 编译:将预处理后的C代码转换为汇编语言。
3. 汇编:将汇编代码转换为机器代码。
4. 链接:将多个目标文件连接成可执行文件。
2. C语言调试器2.1 调试器的作用调试器是一种用于调试程序的工具,可以帮助我们找出程序中的bug并进行修复。
它提供了断点设置、变量查看、单步执行等功能,方便我们逐步调试程序。
2.2 常用的C语言调试器•GDB:GNU Debugger是一个强大的开源调试器,支持多种编程语言,包括C语言。
•LLDB:是一个基于LLVM的调试器,具有与GDB相似的功能。
•Visual Studio Debugger:在Visual Studio IDE中集成了强大的调试功能,方便开发者进行程序调试。
2.3 调试C程序的基本操作调试C程序的基本操作包括设置断点、运行程序、查看变量值、单步执行等。
1. 设置断点:在程序中设置断点,当程序执行到该断点时会暂停执行。
2. 运行程序:启动调试器运行程序,可以逐步执行代码或在断点处停下来。
gcc -i的用法 -回复

gcc -i的用法-回复【GCC -i 的用法】是GNU编译器集合(GNU Compiler Collection)的一个选项。
GCC是一个广泛使用的开源编译器套件,提供了多种编程语言的编译器(如C、C++、Fortran等),可以在多个操作系统上使用。
GCC 的-i选项用于指定用于包含头文件的搜索路径。
下面将逐步回答GCC -i的用法,包括其作用、语法和示例。
第一步:介绍GCC -i的作用GCC -i选项用于指定头文件的搜索路径。
头文件是包含在C或C++源代码中的文件,其中包含了函数声明、宏定义和类型定义。
在编译源代码时,编译器需要访问这些头文件来了解函数和类型的定义,以便正确编译代码。
默认情况下,编译器会在标准搜索路径中寻找头文件,包括系统目录和通常用于头文件的目录。
然而,在某些情况下,我们希望将头文件放置在非标准位置,例如项目特定的文件夹或库文件夹中。
这时,GCC -i选项就可以派上用场。
通过使用GCC -i选项,我们可以告诉编译器在指定的路径中搜索头文件。
这样可以使我们的编译过程更加灵活和适应性强。
第二步:介绍GCC -i的语法GCC -i选项的语法如下所示:gcc -i <include_directory>其中,<include_directory>表示头文件所在的目录路径。
可以通过多次使用-i选项来指定多个搜索路径。
第三步:介绍GCC -i的示例为了更好地理解GCC -i的用法,我们以一个示例为例说明。
假设我们有一个名为"project"的文件夹,其中包含了一个名为"my_header.h"的头文件。
我们希望在编译代码时使用这个自定义的头文件。
1. 首先,我们需要将项目目录添加到GCC的搜索路径中。
我们可以使用-i选项来指定项目的路径,如下所示:gcc -i project/ main.c这将告诉编译器在"project/"目录中搜索头文件。
gcc编译的详细步骤

gcc编译的详细步骤⼀:GCC⼀般编译建⽴hello.c# vi hello.c#include <stdlib.h>#include <stdio.h>void main(void){printf("hello world!\r\n");}⽤gcc编译成执⾏程序。
#gcc -o hello hello.c该命令将hello.c直接⽣成最终⼆进制可执⾏程序a.out这条命令隐含执⾏了(1)预处理、(2)汇编、(3)编译并(4)链接形成最终的⼆进制可执⾏程序。
这⾥未指定输出⽂件,默认输出为a.out。
如何要指定最终⼆进制可执⾏程序名,那么⽤-o选项来指定名称。
⽐如需要⽣成执⾏程序hello.exe那么#gcc hello.c -o hello.exe⼆:GCC编译详细步骤,分为四步:从上⾯我们知道GCC编译源代码⽣成最终可执⾏的⼆进制程序,GCC后台隐含执⾏了四个阶段步骤。
GCC编译C源码有四个步骤:预处理-----> 编译 ----> 汇编 ----> 链接现在我们就⽤GCC的命令选项来逐个剖析GCC过程。
1)预处理(Pre-processing)在该阶段,编译器将C源代码中的包含的头⽂件如stdio.h编译进来,⽤户可以使⽤gcc的选项”-E”进⾏查看。
⽤法:#gcc -E hello.c -o hello.i作⽤:将hello.c预处理输出hello.i⽂件。
[root]# gcc -E hello.c -o hello.i[root]# lshello.c hello.i[root]# vi hello.i# 1 "hello.c"# 1 "<built-in>"# 1 "<command line>"# 1 "hello.c"# 1 "/usr/include/stdlib.h" 1 3# 25 "/usr/include/stdlib.h" 3# 1 "/usr/include/features.h" 1 3# 291 "/usr/include/features.h" 3# 1 "/usr/include/sys/cdefs.h" 1 3# 292 "/usr/include/features.h" 2 3# 314 "/usr/include/features.h" 3# 1 "/usr/include/gnu/stubs.h" 1 3# 315 "/usr/include/features.h" 2 3# 26 "/usr/include/stdlib.h" 2 3# 3 "hello.c" 2void main(void){printf("hello world!\r\n");}2)编译阶段(Compiling)第⼆步进⾏的是编译阶段,在这个阶段中,Gcc⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作,在检查⽆误后,Gcc把代码翻译成汇编语⾔。
gcc-搜搜百科

gcc-搜搜百科gcc摘要由GNU之⽗Stallman所开发的linux下的编译器,全称为GNU Compiler ,⽬前可以编译的语⾔包括:C, C++, , Fortran, Java, and , 可以在其官⽅页⾯找到更加详细的信息GCC是⼀个原本⽤于Unix-like系统下编程的编译器。
不过,现在GCC也有了许多下的移植版本。
这要感谢Internet上众多程序员的共同努⼒。
*Win32 下的 GCC 详细可察看词条:GCC for Win32⽬录123456⽬录12345678910GCC是GNU公社的⼀个项⽬。
是⼀个⽤于编程开发的⾃由编译器。
最初,GCC只是⼀个C语⾔编译器,他是GNU C Compiler 的英⽂缩写。
随着众多⾃由开发者的加⼊和GCC⾃⾝的发展,如今的GCC以经是⼀个包含众多语⾔的编译器了。
其中包括 C,C++,Ada,Object C和Java等。
所以,GCC也由原来的GNU C Compiler变为GNU Compiler Collection。
也就是 GNU编译器家族的意思。
当然,如今的GCC借助于他的特性,具有了交叉编译器的功能,即在⼀个平台下编译另⼀个平台的代码。
直到现在,GCC的历史仍然在继续,他的传奇仍然被⼈所传颂。
Linux系统下的Gcc(GNU C Compiler)是GNU推出的功能强⼤、性能优越的多平台编译器,是GNU的代表作品之⼀。
gcc是可以在多种硬体平台上编译出的超级编译器,其执⾏效率与⼀般的编译器相⽐平均效率要⾼20%~30%。
Gcc编译器能将C、源程序、汇程式化序和编译、连接成可执⾏⽂件,如果没有给出可执⾏⽂件的名字,gcc将⽣成⼀个名为a.out的⽂件。
在Linux系统中,可执⾏⽂件没有统⼀的后缀,系统从⽂件的属性来区分可执⾏⽂件和不可执⾏⽂件。
⽽gcc则通过后缀来区别输⼊⽂件的类别,下⾯我们来介绍gcc所遵循的部分约定规则。
.c为后缀的⽂件,C语⾔源代码⽂件;.a为后缀的⽂件,是由⽬标⽂件构成的档案库⽂件;.C,.cc或.cxx 为后缀的⽂件,是C++源代码⽂件;.h为后缀的⽂件,是程序所包含的;.i 为后缀的⽂件,是已经预处理过的C源代码⽂件;.ii为后缀的⽂件,是已经预处理过的C++源代码⽂件;.m为后缀的⽂件,是Objective-C源代码⽂件;.o为后缀的⽂件,是编译后的⽬标⽂件;.s为后缀的⽂件,是汇编语⾔源代码⽂件;.S为后缀的⽂件,是经过预编译的汇编语⾔源代码⽂件。
GCC常用命令详解

GCC常⽤命令详解GCC(GNU Compiler Collection)是Linux下最常⽤的C语⾔编译器,是GNU项⽬中符合ANSI C标准的编译系统,能够编译⽤C、C++和Object C等语⾔编写的程序。
同时它可以通过不同的前端模块来⽀持各种语⾔,如Java、Fortran、Pascal、Modula-3和Ada等。
穿插⼀个玩笑: GNU意思是GNU’s not Unix⽽⾮⾓马。
然⽽GNU还是⼀个未拆分的连词,这其实是⼀个源于hacker的幽默:GNU是⼀个回⽂游戏,第⼀个字母G是凑数的,你当然可以叫他做ANU或者BNU。
下⾯开始。
⼀.CC编译程序过程分四个阶段◆预处理(Pre-Processing)◆编译(Compiling)◆汇编(Assembling)◆链接(Linking)Linux程序员可以根据⾃⼰的需要让GCC在编译的任何阶段结束转去检查或使⽤编译器在该阶段的输出信息,或者对最后⽣成的⼆进制⽂件进⾏控制,以便通过加⼊不同数量和种类的调试代码来为今后的调试做好准备。
如同其他的编译器,GCC也提供了灵活⽽强⼤的代码优化功能,利⽤它可以⽣成执⾏效率更⾼的代码。
GCC提供了30多条警告信息和三个警告级别,使⽤它们有助于增强程序的稳定性和可移植性。
此外,GCC还对标准的C和C++语⾔进⾏了⼤量的扩展,提⾼程序的执⾏效率,有助于编译器进⾏代码优化,能够减轻编程的⼯作量。
⼆.简单编译命令我们以Hello world程序来开始我们的学习。
代码如下:/* hello.c */#include <stdio.h>int main(void){printf ("Hello world!\n");return 0;}1. 执⾏如下命令:$ gcc -o hello hello.c运⾏如下: $ ./hello输出: Hello,world!2. 我们也可以分步编译如下:(1) $ gcc –E hello.c -o hello.i//预处理结束//这时候你看⼀下hello.i ,可以看到插进去了很多东西。
makefile gcc编译

makefile gcc编译
Makefile 是一个用来组织代码编译的工具,而 GCC 是一个常用的 C 和 C++ 编译器。
在 Makefile 中使用 GCC 进行编译可以通过以下步骤完成:
1. 创建一个名为 "Makefile" 的文本文件,并确保它位于你的项目根目录下。
2. 在 Makefile 中定义你的编译规则。
例如,假设你有一个名为 "main.c" 的源文件需要编译成可执行文件 "app",你可以这样编写 Makefile:
make.
app: main.c.
gcc -o app main.c.
在这个例子中,我们定义了一个名为 "app" 的目标,它依赖于"main.c" 这个源文件。
当你运行 "make" 命令时,Make 工具会根
据这个规则来执行编译。
3. 打开终端,进入到包含 Makefile 的项目目录下。
4. 运行命令 "make"。
Make 工具会读取 Makefile 文件,并执行其中定义的编译规则。
在这个例子中,它会使用 GCC 编译器来编译 "main.c" 并生成可执行文件 "app"。
需要注意的是,Makefile 可以包含更复杂的规则和变量定义,以及支持多个源文件的编译。
你可以根据你的项目需求来进一步扩展和定制 Makefile 文件。
总之,通过合理编写 Makefile 并结合使用 GCC 编译器,你可以高效地组织和管理你的代码编译过程。
gcc交叉编译命令

gcc交叉编译命令一、概述GCC(GNU Compiler Collection)是一个自由软件编程语言的编译器系列,包括C、C++、Objective-C、Fortran、Ada等语言的编译器。
交叉编译是指在一台计算机上使用GCC编译生成另一种架构的目标代码,以便在另一种架构的计算机上运行。
本文将介绍GCC交叉编译命令的使用方法,包括安装交叉编译工具链、设置环境变量、配置GCC交叉编译选项等。
二、安装交叉编译工具链1. 下载工具链在进行交叉编译之前,需要先下载对应架构的交叉编译工具链。
可以从各个芯片厂商或开发板厂商的官网下载。
2. 安装工具链将下载好的压缩包解压到指定目录下即可完成安装。
例如:```$ tar -zxvf arm-linux-gcc-4.4.3.tar.gz -C /usr/local/```三、设置环境变量1. 编辑.bashrc文件打开终端并输入以下命令:```$ vi ~/.bashrc```2. 设置环境变量在.bashrc文件中添加以下内容:```export PATH=$PATH:/usr/local/arm-linux-gcc-4.4.3/bin export CROSS_COMPILE=arm-linux-```其中,第一行将交叉编译工具链的bin目录添加到PATH环境变量中,以便在终端中直接使用交叉编译工具链。
第二行设置CROSS_COMPILE环境变量为arm-linux-,以便在Makefile中使用。
3. 使环境变量生效保存并退出.bashrc文件后,执行以下命令使环境变量生效:```$ source ~/.bashrc```四、配置GCC交叉编译选项1. 编写Makefile文件在需要进行交叉编译的项目目录下新建一个名为Makefile的文件,并编辑以下内容:```CC=$(CROSS_COMPILE)gccLD=$(CROSS_COMPILE)ldOBJCOPY=$(CROSS_COMPILE)objcopyCFLAGS=-Wall -O2 -gall: main.binmain.bin: main.elf$(OBJCOPY) -O binary $< $@main.elf: main.o$(LD) -Ttext 0x10000 -o $@ $<main.o: main.c$(CC) $(CFLAGS) -c $< -o $@clean:rm -f *.o *.elf *.bin```2. 解释Makefile文件该Makefile文件定义了三个变量:CC、LD、OBJCOPY。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
gcc –o hello_rd hello.c -rdynamic #生成可执行程序 hello_rd (2)C++版 helloworld.C(可参照(1)进行编译,搞清楚参数的意义及作用) #include <iostream.h> main (void) { cout << "Hello, World!" << endl; } 用户可以像使用 gcc 一样,使用 c++或 g++来编译它: g++ hello.C #生成可执行程序 a.out c++ –o hello hell.C #生成可执行程序 hello g++ –s -o Hello hello.C #生成删除符号表的可执行程序 Hello 也可以使用 gcc 并指定库文件来编译 c++程序: gcc –c hello.C #生成目标文件 hello.o gcc –o h hello.C –lstdc++ #指定标准 c++库,生成可执行程序 h 也参照标准 c 的编译方法以不同形式编译 c++程序和 gelloworld.C。 2)多模块组合开发与编译、静态库的构造与使用 设有 C 语言文件 f1.c,内容为: #include <stdio.h> f1(int arg) { printf("F1: you passed %d\n",arg); } 设有 C 语言文件 f2.c,内容为: #include <stdio.h> f2(char *arg) { printf("F2: you passed %s\n",arg); } 主函数所的模块为 m.c,内容为: #include <stdio.h> main() { f1(16); f2("Hello World!"); } 编译和连接过程: gcc –c f1.c f2.c // 生成 f1.o 和 f2.o gcc –S f1.c f2.c // 生成 f1.s 和 f2.s gcc –o mp m.c f1.c f2.c //生成 mp 构造自己的静态库 gcc –o f1.c f2.c //生成目标文件 f1.o, f2.o ar crv libmyl.a f1.o f2.o //生成库 libmyl.a
if(err){ fprintf(stderr,err); exit(2); } f2=dlsym(sfp,"f2"); //获取函数 f2 入口地址(指针) err=dlerror(); //检查是否成功 if(err){ fprintf(stderr,err); exit(3); } fprintf(stderr,"-----------begine-------------\n"); f2("Test String"); //调用函数 f2 f1(tmpi); //调用函数 f1 fprintf(stderr,"++++++++++++end+++++++++++++++\n"); dlclose(sfp); exit(0); } 4)Makefile 的编写与使用 (1)针对 2)的 Makefile 文件 a.Makefile 文件的构造 f: f1.o f2.o f3.o gcc -o f f1.o f2.o f3.o f1.o: f1.c gcc –c f1.c f2.o: f2.c gcc –c f2.c f3.o: f3.c gcc –c f3.c b.Makefile 的使用 make #生成默认(第一个)目标 make f #生成目标 f make f1.o #生成目标 f1.o (2)针对 3)的 Makefile 文件 a.动态库生成 Makefile so.mk all : libmy.so SRC = f1.c f2.c TGT = $(SRC:.c=.o) %.o : %.c gcc -c $< libmy.so : $(TGT) gcc -shared -o $@ $(TGT) clean: rm -f $(TGT) 使用方法: make -f so.mk make -f so.mk all //关闭共享库
sfp=dlopen(SO_FILE,RTLD_LAZY); //打开共享库 if(sfp==NULL){ fprintf(stderr,dlerror()); exit(1); } f1=dlsym(sfp,"f1"); err=dlerror(); //获取函数 f1 入口地址(指针) //检查是否成功
ranlib libmyl.a 使用自己的库 gcc –o mp m.c libmyl.a gcc –o mp m.o libmyl.a gcc –o mp m.c -L. –lmyl
[注] 静态库和共享库的共同点:
//为子函数建立内容表 // 使用库 libmyl.a // 使用库 libmyl.a 和 m.o // 在当前目录以默认方法使用库 myl
#定义 all 目标 #定义源文件 #定义目标文件 #定义目标文件生成规则 #目标文件生成命令 #定义共享库生成规则 #共享库生成命令 #定义清理目标 #清理目标目标措施
make -f so.mk install make -f so.mk uninstall make -f so.mk clean b.共享库使用 Makefile e all : mydy SRC = f3.c TGT = $(SRC:.c=.o) %.o : %.c gcc -c $< mydy: $(TGT) gcc -o $@ $(TGT) -ldl clean: rm -f $(TGT) 使用方法: make -f e make -f so.mk all 5)实验报告的内容与书写 以书面形式记录下你的每一步过程,包括输入、输出信息(有截图) ,遇到的问题和解决的 办法。
Hale Waihona Puke 3、实验方法与注意事项实验室内的实验环境与系统是共用设施, 请不要在系统内做对系统或对其他用户不安全 的事情。 要求每个同学登录后系统后, 要在自己的家目录内容以自己名字和学号, 创建一个子目 录(已有者可以不再创建) 。以后所有工作都要在自己的目录内进行。建议以后的实验都在 同台计算机上做,这样可以保持连续性。 1)由于是以 root 用户工作的,权力很大,请不要在系统内做对系统或对其他用户不 安全的事情。 2)要求每个同学登录后系统后,要在自己的家目录内容以自己(汉语拼音)名字,使用 mkdir 命令创建一个子目录。以后所有工作都要在自己的目录内进行。 3)认真编写实验报告并上传服务器。 用户要按通常实验要认真书写实验报告。
实验 4:UNIX gcc 编译器的使用与编程环境 1、实验目的
(1)掌握 gcc 的用法; (2)了解目标代码、库函数的使用; (3)掌握静态库和共享库的构造与使用; (4)掌握多模块和多语言联合开发方法; (5)掌握 make 命令和 Makefile 文件的使用。
2、实现设备
一台装有 Windows 操作系统和 Linux 机系统的微机或服务器。
3)多模块组合开发与编译、共享库的构造与使用 参考 2)中的 f1.c 和 f2.c,构造和使用自己的共享库 (1)构造可共享库 gcc -c f1.c f2.c //生成目标文件 gcc -shared -o libmy.so f1.o f2.o //由目标文件生成共享库 或 gcc -shared –o libmy.so –c f1.c f2.c //由源文件生成共享库 (2)使用共享库 //设以下程序的文件名为 f3.c,f1.c 和 f2.c 如前 #include <stdio.h> #include <dlfcn.h> #define SO_FILE "./libmy.so" //共享库 libmy.so 被限定在当前目录,也可放在标准位置,但要使用 ldd 和 ldconfig 处理 main() { void *sfp; char *err; int tmpi=16; int (*f1)(int ),(*f2)(char *); //定义函数指针
.a, .so 都是.o 目标文件的集合,这些目标文件中含有一些函数的定义(机器码),而这些函数将在连 接时会被最终的可执行文件用到。 两者的区别: 静态库.a : 当程序与静态库连接时,库中目标文件所含的所有将被程序使用的函数的机器码被 copy 到最终的可执行文件中. 静态库有个缺点: 占用磁盘和内存空间. 静态库会被添加到和它连接的每个程序 中, 而且这些程序运行时, 都会被加载到内存中. 无形中又多消耗了更多的内存空间. 共享库.so : 与共享库连接的可执行文件只包含它需要的函数的引用表,而不是所有的函数代码,只有 在程序执行时, 那些需要的函数代码才被拷贝到内存中, 这样就使可执行文件比较小, 节省磁盘空间(更进 一步,操作系统使用虚拟内存,使得一份共享库驻留在内存中被多个程序使用).共享库还有个优点: 若库 本身被更新, 不需要重新编译与它连接的源程序。
4、实验过程
1)helloworld (1)C 语言版 helloworld.c #include <stdio.h> main() { printf(”Hello World!\n”); } 编译及运行方法: (注意观察各编译参数的意义及作用, 最后通过命令 ls –l a.out hello* 来观察所生成文件的不同,为什么会这样?) gcc –c hello.c #生成目标文件 hello.o gcc –S hello.c #生成汇编程序 hello.s gcc hello.c #生成可执行程序 a.out gcc –o hello hello.c #生成可执行程序 hello gcc –s –o hello_s hello.c #生成汇编程序 hello.s gcc –o hello_st hello.c -static #生成可执行程序 hello_st gcc –o hello_sh hello.c -shared #生成可执行程序 hello_sh