首页 > 编程知识 正文

csharp在linux上编译,linux编译多个c文件

时间:2023-05-04 03:40:28 阅读:21305 作者:225

原始标题:嵌入式Linux中最常用的c语言编译器GCC命令的详细信息

通用计算机编译(gcc )是Linux上最常用的c语言编译器,是GNU项目中符合ANSI C标准的编译系统,用于编译用c、c、Object C等语言编写的程序此外,各种前端模块(如Java、Fortran、Pascal、Modula-3和Ada )可以支持多种语言。

开玩笑地说,GNU的意思是GNU’snot UNIX而不是角马。 但GNU还是个未分割的连词,这其实是源于hacker的幽默。 GNU是回文游戏,第一个字母g是数字的集合,也可以称为ANU或BNU。 那我们开始吧。

一.抄送编译器过程分为四个阶段

预处理(预处理)

编译(Compiling )

汇编(Assembling ) )

链接链接

Linux程序员可以通过添加不同数量和类型的调试代码(如果需要)来结束GCC在编译的任何阶段的检查,使用编译器在该阶段的输出信息,控制最后生成的二进制文件像其他编译器一样,GCC也提供灵活、强大的代码优化功能,利用它可以产生更高效的代码。

GCC提供了30多条警告消息和三个警告级别,它们可以提高程序的稳定性和可移植性。 另外,GCC可以大大扩展标准的c和c语言,提高程序的执行效率,有助于编译器优化代码,减轻编程工作量。

二.简单编译指令

我们用Hello world计划开始我们的学习。 代码如下。

/* hello.c */

#包含

输入主(语音) )。

{

打印(hello world! n ';

返回0;

}

运行$ gcc -o hello hello.c命令

按以下方式执行: $ ./hello

输出: Hello,world!

2 .也可分阶段编译如下:

(1) $ gcce hello.c-o hello.I

//预处理结束

//此时,请看hello.i。 你会发现插入了很多东西。

(2) $ gccshello.I

//生成汇编代码并退出

(3) $ gccchello.c

或:

$ gcc-chello.co hello.o

或:

$ gcc -c hello.i -o hello.o

//编译结束

生成hello.o文件

(4) $ gcc hello.oo hello.o

或:

$ gccohellohello.c

//链接完成,生成可执行代码

3 .可以编译几个文件并生成相同的可执行文件。

例如,一个项目包含main.c foo.c def.c生成foo的可执行文件。

编译命令如下:

$ gcccmain.cfoo.cdef.cofoo

或:

$ gccofo omain.cfoo.cdef.c

3 .库依赖

包装器是头文件. h和库文件. so或. a的集合。 默认情况下,Linux中的大多数函数会将头文件放在/usr/include/目录中,将库文件放在/usr/lib/目录中,但不是绝对的。 因此,GCC具有用于添加头文件和库文件的编译选项开关。

1 .添加头文件:-I

例如,/home/work/include/目录包含编译foo.c所需的头文件def.h,必须使用-I选项才能使GCC找到它们。

$ gcc foo.c-I/home/work/include/def.h-ofoo

2 .添加库文件:-L

例如,/home/work/lib/目录包含链接所需的库文件libdef.so,GCC必须使用-L选项才能找到它们。

$ gcc foo.cl/home/work/libldef.aofoo

说明:-l选项指示GCC连接到库文件libdef.so。 在Linux下命名库文件有一个规则,即库文件以lib3字符开头。 由于所有库文件都遵守此规则,因此在使用-l选项指定链接的库文件名时可以省略lib3字符。

外语:

Linux下的库文件分为动态链接库. so文件和静态链接库. a文件。 默认情况下,GCC优先于动态库,如果同时存在动态库和静态库,则必须指定-static选项才能链接静态库。 例如,如果上面的示例中有libdef.a,并且您想要链接libdef.a,则命令如下所示:

$ gcc foo.cl/home/work/libs

tatic –ldef.a –o foo

四.代码优化

GCC提供不同程度的代码优化功能。开关选项是:-On,n取值为0到3。默认为1。-O0表示没有优化,而-O3是最高优化。优化级别越高代码运行越快,但并不是所有代码都能够加载最高优化,而应该视具体情况而定。但一般都使用-O2选项,因为它在优化长度、编译时间和代码大小之间,取得了一个比较理想的平衡点。

以下这段说的比较详细:

编译时使用选项-O可以告诉GCC同时减小代码的长度和执行时间,其效果等价于-O1。在这一级别上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。选项-O2告诉GCC除了完成所有-O1级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项-O3则除了完成所有-O2级别的优化之外,还包括循环展开和其它一些与处理器特性相关的优化工作。通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越快。

下面通过具体实例来感受一下GCC的代码优化功能,所用程序如清单3所示。

/* optimize.c */

#include

int main(void)

{

double counter;

double result;

double temp;

for (counter = 0;

counter < 2000.0 * 2000.0 * 2000.0 / 20.0 + 2020;

counter += (5 - 1) / 4) {

temp = counter / 1979;

result = counter;

}

printf("Result is %lfn", result);

return 0;

}

首先不加任何优化选项进行编译:

# gcc -Wall optimize.c -o optimize

借助Linux提供的time命令,可以大致统计出该程序在运行时所需要的时间:

# time ./optimize

Result is 400002019.000000

real 0m14.942s

user 0m14.940s

sys 0m0.000s

接下去使用优化选项来对代码进行优化处理:

# gcc -Wall -O optimize.c -o optimize

在同样的条件下再次测试一下运行时间:

# time ./optimize

Result is 400002019.000000

real 0m3.256s

user 0m3.240s

sys 0m0.000s

对比两次执行的输出结果不难看出,程序的性能的确得到了很大幅度的改善,由原来的14秒缩短到了3秒。这个例子是专门针对GCC的优化功能而设计的,因此优化前后程序的执行速度发生了很大的改变。尽管GCC的代码优化功能非常强大,但作为一名优秀的Linux程序员,首先还是要力求能够手工编写出高质量的代码。如果编写的代码简短,并且逻辑性强,编译器就不会做更多的工作,甚至根本用不着优化。

优化虽然能够给程序带来更好的执行性能,但在如下一些场合中应该避免优化代码:

◆ 程序开发的时候优化等级越高,消耗在编译上的时间就越长,因此在开发的时候最好不要使用优化选项,只有到软件发行或开发结束的时候,才考虑对最终生成的代码进行优化。

◆ 资源受限的时候一些优化选项会增加可执行代码的体积,如果程序在运行时能够申请到的内存资源非常紧张(如一些实时嵌入式设备),那就不要对代码进行优化,因为由这带来的负面影响可能会产生非常严重的后果。

◆ 跟踪调试的时候在对代码进行优化的时候,某些代码可能会被删除或改写,或者为了取得更佳的性能而进行重组,从而使跟踪和调试变得异常困难。返回搜狐,查看更多

责任编辑:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。