linux环境编程

1、GCC简介

GCC(GNU Compiler Collection,GNU编译器套件):是由GNU开发的编程语言编译器。GCC编译器套件支持多种语言的编译,包括了C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库。下面表格中列了些对于C、C++相关的主要软件包: 
1
名称功能
cppC预处理器
gccC编译器
g++c++编译器
gccbug创建BUG报告的shell脚本
gcov覆盖测试工具,用于分析程序哪里做优化效果最佳
libgccGCC的运行库
libstdc++标准的C++库
libsupc++提供支持C++语言的函数库

2、GCC使用方法

2.1、最基本用法

$ gcc [选项扩展名] [文件名]1

用于编译和链接C/C++程序所需的选项扩展名及介绍:


表1 C/C++程序常用文件名后缀

选项扩展名文件内容
.a静态库,由目标文件构成的文件库
.cC语言源码,必须经过预处理
.C,.cc或.cxxc++源代码文件,必须经过预处理
.hC/C++语言源代码的头文件
.i.c文件经过预处理后得到的C语言源代码
.ii.C,.cc或.cxx文件经过预处理后得到的C语言源代码
.o目标文件,是编译过程得到的中间文件
.s汇编语言文件,是.i文件编译后得到的C++源码文件
.so共享对象库,也称动态库

2.2、GCC编译过程

注:以下列子以hello.c文件进行举例 这里写图片描述 (1)、预处理:C编译器对各种预处理命令进行处理,包括头文件包含、宏定义的扩展、条件编译的选择等。 预处理的gcc命令:

$ gcc -E hello.c -o hello.i1

(2)、编译:将预处理得到的源代码文件进行”翻译转换”,产生出机器语言的目标程序,得到机器语言的汇编文件。 编译的gcc命令:

$ gcc -S hello.i1

(3)、汇编:将汇编代码翻译成机器码,但是还是不可以运行。 汇编的gcc命令:

$ gcc -c hello.s1

(4)、链接:处理可重定位文件,把各种符号引用和符号定义转换成为可执行文件中的合适信息,通常是虚拟地址。 链接的gcc命令:

$ gcc hello.o  //默认生成a.out执行文件
$ gcc hello.o -o hello //通过-o参数命令指定生成新的执行文件名12

注:链接分为动态链接和静态链接。 a、动态链接:使用动态链接库进行链接,生成的程序在执行的时候需要加载所需要的动态库才能运行。动态链接生成的程序小巧,但是必须依赖动态库,否则无法执行。可以说linux下的动态链接库实际是共享目标文件,一般是.so文件,类似于windows下的.dll文件。 b、静态链接:使用静态库进行链接,生成的程序包含程序运行所需要的全部库,可以直接运行,不过体积较大。linux下静态库是汇编产生的.o文件的集合,一般以.a文件形式出现。 c、gcc默认是动态链接,加上-static参数则采用静态链接。

$gcc hello.o -static -o hello_static1

表2 常用的GCC编译控制选项

名称功能描述
-c只编译不连接。编译器只是将输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件
-S只对文件进行编译,不汇编和链接
-E只对文件进行预处理,不编译汇编和链接
-o output_filename确定输出文件的名称为output_filename,这个名称不能和源文件同名,若不给出名称,将默认生成可执行文件a.out
-g产生符号调试工具(GNU的gdb)所必要的符号信息,要想对源代码进行调试,就必须加入这个选项。g也分等级,默认是-g2,-g1是最基本的,-g3包含宏信息
-DFOO =BAR在命令行定义预处理宏FOO,值为BAR
-O对程序进行优化编译、链接。采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是编译、链接的速度就相应地慢一些
-ON指定代码的优化等级为N,可取值为0,1,2,3;O0没有优化,O3优化级别最高
-Os使用了-O2的优化部分选项,同时对代码尺寸进行优化
-I dirname将dirname目录加入到程序头文件搜索目录列表中,是在预编译过程中使用的参数
-L dirname将dirname目录加入到库文件搜索目录列表中
-l FOO链接名为libFOO的函数库
-static链接静态库
-ansi支持ANSI/ISO C的标准语法,取消GNU语法中与该标准相冲突的部分
-w关闭所有警告,不建议使用
-W开启所有gcc能提供的警告
-werror将所有警告转换为错误,开启该选项,遇到警告都会终止编译
-v显示gcc执行时的详细过程,GCC及其相关程序的版本号

2.3、头文件的包含

在C程序中头文件的包含有两种方式:

(1)、#include<stdio.h>
(2)、#include"stdio.h"12

对于(1)使用尖括号的情况,预处理器会在系统预设的头文件包含目录搜索头文件 对于(2)使用双引号的情况,预处理会先在目标文件所在目录进行相应的头文件的搜索,如果当前目录没有,则会到系统预设的头文件包含的目录继续搜索。 注:在编译的时候也可以通过 -I dirname参数命令将指定的目录添加到头文件搜索目录列表中。

$ gcc -v hello.c -I /home/vmuser/hello1

2.4、库文件链接

在实际产品开发过程中,往往会对某个产品的一些功能进行封装,以库文件的形式发布,给第三方用户使用。第三方用户拿到这个库文件,就必须在编译的时候将这个库链接到应用程序中。 库文件用法有两种: (1)、在编译列表中写出库文件全名(可带路径),在这里假设一个静态库文件名为libsos.a/libsos.so,那么链接方式为:

$gcc hello.c libsos.a 
$gcc hello.c libsos.so12

(2)、分别用 -L指定库文件路径,并用 -l参数加上FOO名称即可,无需库文件全名。 a、将libsos.so所在目录添加到系统库文件搜索路径中,在编译的时候通过 -L dirname 完成。

$ gcc hello.c -L /home/vmuser/hello1

b、指定链接库文件名,在编译的时候可通过 -lFOO参数将libsos.so链接到应用中:

$gcc hello.c -L /home/vmuser/hello -lFOO1

注:使用了第三方库动态编译的可执行程序,在运行的时候还需要加载相应的库文件,但库文件的存放路径无需与编译路径一致,只要放在运行系统环境的库文件路径即可。

2.5、静态库和共享库的创建

(1)、静态库是.o文件的集合,这些.o文件是编译器按照常规方法生成的,在Linux下也称文档(archive),用ar工具来管理。 下面以用两个C文件创建静态库为例:在用户主目录下,创建一个libhelloa目录,并在其中创建hello1.c和hello2.c两个文件。 将两个文件编译成目标文件:

$gcc -c hello1.c hello2.c1

用ar命令创建静态库文件:

$ar -r libhello.a hello1.o hello2.o1

(2)、共享库也是目标文件的集合,但这些文件是由编译器按照特殊方式生成的,对象模块的每个地址(函数调用和变量引用)都是相对地址,允许在运行时被动态加载和运行。 创建共享库首先需要编译对象模块。继续以hello1.c和hello2.c为例进行示范。 在用户主目录下,创建一个libhelloso目录,并在其中创建hello1.c和hello2.c两个文件。

$gcc -c - fpic hello1.c hello2.c1

与创建静态库不同,这里加入了-fpic参数,表示生成的对象模块是可重定位的,pic表示位置独立代码。 编译完成,得到了hello1.o和hello2.o两个文件,再用下列命令生成共享库。

$gcc -shared hello1.o hello2.o  -o libhello.so

以上就是良许教程网为各位朋友分享的Linux相关知识。

已标记关键词 清除标记
相关推荐
<p> 这是一门linux下c++通讯架构实战课程,针对c/c++语言已经掌握的很熟并希望进一步深造以将来用c++在linux下从事网络通讯领域/网络服务器的开发和架构工作。<br /> <br /> 这门课程学习难度颇高但也有着极其优渥的薪水(最少30K月薪,最高可达60-80K月薪),这门课程,会先从nginx源码的分析和讲解开始,逐步开始书写属于自己的高性能服务器框架代码,完善个人代码库,这些,将会是您日后能取得高薪的重要筹码。 </p> <p> <br /> </p> <p> <span style="color:#E53333;">本课程原计划带着大家逐行写代码,但因为代码实在过于复杂和精细,带着写代码可能会造成每节课至少要4~5小时的超长时间,所以老师会在课前先写好代码,主要的时间花费在逐行讲解这些代码上,这一点望同学们周知。如果你觉得非要老师领着写代码才行的话,老师会觉得你当前可能学习本门课程会比较吃力,请不要购买本课程,以免听不懂课程并给老师差评,差评也会非常影响老师课程的销售并造成其他同学的误解。</span> </p> <p> <br /> </p> <p> 这门课程要求您具备下面的技能:<br /> (1)对c/c++语言掌握的非常熟练,语言本身已经不是继续学习的障碍,并不要求您一定熟悉网络或者linux;<br /> (2)对网络通讯架构领域有兴趣、勇于挑战这个高难度的开发领域并期望用大量的付出换取高薪;<br /> <br /> 在这门课程中,实现了一个完整的项目,其中包括通讯框架和业务逻辑框架,浓缩总结起来包括如下几点:<br /> (1)项目本身是一个极完整的多线程高并发的服务器程序;<br /> (2)按照包头包体格式正确的接收客户端发送过来的数据包, 完美解决收包时的数据粘包问题;<br /> (3)根据收到的包的不同来执行不同的业务处理逻辑;<br /> (4)把业务处理产生的结果数据包正确返回给客户端;<br /> <br /> 本项目用到的主要开发技术和特色包括:<br /> (1)epoll高并发通讯技术,用到的触发模式是epoll中的水平触发模式【LT】;<br /> (2)自己写了一套线程池来处理业务逻辑,调用适当的业务逻辑处理函数处理业务并返回给客户端处理结果;<br /> (3)线程之间的同步技术包括互斥量,信号量等等;<br /> (4)连接池中连接的延迟回收技术,这是整个项目中的精华技术,极大程度上消除诸多导致服务器程序工作不稳定的因素;<br /> (5)专门处理数据发送的一整套数据发送逻辑以及对应的发送线程;<br /> (6)其他次要技术,包括信号、日志打印、fork()子进程、守护进程等等; </p> <div> <br /> </div>
<p> <span> </span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span class="ql-author-24357476"><span style="font-size:14px;"> </span></span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> 人工智能、物联网、大数据时代,Linux正有着一统天下的趋势,几乎每个程序员岗位,都要求掌握Linux。本课程零基础也能轻松入门。 </p> <p class="ql-long-24357476"> <br /> </p> <p class="ql-long-24357476"> 本课程以简洁易懂的语言手把手教你系统掌握日常所需的Linux知识,每个知识点都会配合案例实战让你融汇贯通。课程通俗易懂,简洁流畅,适合0基础以及对Linux掌握不熟练的人学习; </p> <p> <span></span> </p> <p> <span style="color:#FF9900;"><span><span> </span></span></span> </p> <p class="ql-long-24357476"> <span style="background-color:#FFFFFF;color:#E53333;">【限时福利】</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span class="ql-author-24357476">1)购课后按提示添加小助手,进答疑群,还可获得价值300元的编程大礼包!</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span class="ql-author-24357476"><span>2)本月购买此套餐加入老师答疑交流群,可参加老师的免费分享活动,学习最新技术项目经验。</span><br /> </span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span class="ql-author-24357476">---------------------------------------------------------------</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span class="ql-author-24357476" style="color:#E53333;">99元=掌握Linux必修知识+社群答疑+讲师社群分享会+700元编程礼包。</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span class="ql-author-24357476" style="color:#E53333;"><br /> </span> </p> <p style="font-size:11pt;color:#494949;"> <span> <img alt="" src="https://img-bss.csdn.net/202002140604337221.png" /></span> </p>
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页