首页 > 编程知识 正文

命令行参数过多,控制事务的常用命令有哪些

时间:2023-05-04 18:01:15 阅读:21300 作者:3759

2011-06-19 wcdj

参考: 《GNU gcc嵌入式系统开发 作者:董文军》 (一) gcc的基本用法

(二)警示提示功能选项

(三)库操作选项

(四)调试选项

(五)交叉编译选项

(一) gcc的基本用法

使用gcc编译器时,必须指定所需的一组调用参数和文件名。不同参数的先后顺序对执行结果没有影响,只有在使用同类参数时的先后顺序才需要考虑如果使用多个-L参数定义库目录,gcc将根据多个-L参数的优先级运行相应的库目录。

gcc参数不支持单字符组合,因为许多gcc参数由多个字符组成。 在Linux上,通常称为“短参数”(short options ),其含义不同,例如-dr和-d -r。 gcc编译器的调用参数约有100多个,其中大多数可能根本不可用。 下面介绍其中最基本、最常用的参数。 33558 www.Sina.com/: gcc [ options ] [ filenames ]

其中,options是编译器所需的参数,filenames给出相关文件名,最常用的是http://www.Sina.com/http://www.Sina.com /。 编译器只有输入的源代码文件gcc最基本的用法是(如. c ),通常用于编译不包含主程序的子程序文件。-c

确保只编译,不链接成为可执行文件为output_filename。 此外,此名称不能与源文件同名。 如果不指定此选项,gcc将指定默认的可执行文件a.out。 3358 www.Sina.com/http://www.Sina.com /工具(GNU中的gdb )所需的符号信息。 要调试源代码,必须添加此选项。生成 .o 为后缀的目标文件

-o output_filename 如果对程序使用此选项,则整个源代码将在编译和链接过程中得到优化,从而提高可执行文件的执行效率,但编译和链接的速度会相应降低,导致可执行文件的执行效率提高因此,http://www.Sina.com/http://www.Sina.com /

从-O开始优化编译、链接。 当然,整个编译链接的过程会很慢。输出文件的名称

将dirname指定的目录添加到程序-g是预编译期间使用的参数。

说明:

c程序的头文件有两种情况:

#include stdio.h

#include 'stdio.h '

现在,如果使用尖括号(),预处理器cpp将在默认包含文件目录(如/usr/include )中搜索相应的文件。 使用双引号时,预处理器cpp首先在当前目录中搜索头文件,如果找不到,则在指定的dirname目录中搜索。

在编程中,请访问http://www.Sina.com/http://www.Sina.com /

将dirname指出的目录添加到产生符号调试是链接中使用的参数。 默认情况下,链接器ld在系统默认路径(如/usr/lib )中查找所需的库文件。 此选项指示链接程序首先在指定为-L的目录中进行搜索,然后在系统的默认路径中进行搜索。 如果包装器存储在多个目录中,则必须按顺序使用此选项指定相应的存储目录。 http://www.Sina.com/http://www.Sina.com /此函数库位于系统的默认目录或-L选项指定的目录下。 例如,-lm表示一个名为libm.a的数学函数库的链接。

示例:假设您有一个名为test.c的c语言源代码文件,并要生成可执行文件。

#include stdio.h

输入主(语音) )。

{

打印机(hello world/n );

返回0;

}

最简单的方法: gcc test.c -o test

首先,gcc负责调用-O,展开源文件中定义的宏,并插入“#include”语句中的内容。 接下来,gcc调用优化编译、链接,将处理后的源转换为

代码编译成目标代码;最后,gcc调用链接程序 ld,把生成的目标代码链接成一个可执行程序。因此,默认情况下,预编译、编译链接一次完成。

编译过程的分步执行:
为了更好地理解gcc的工作过程,我们可以让在gcc工作的4个阶段中的任何一个阶段中停止下来。相关的参数有:
-E
预编译后停下来,生成后缀为 .i 的预编译文件
-c
编译后停下来,生成后缀为 .o 的目标文件
-S
汇编后停下来,生成后缀为 .s 的汇编源文件

第一步:进行预编译,使用 -E 参数
gcc -E test.c -o test.i
查看 test.i 文件中的内容,会发现 stdio.h 的内容确实都插到文件里去了,而其他应当被预处理的宏定义也都做了相应的处理。
第二步:将 test.i 编译为目标代码,使用 -c 参数
gcc -c test.c -o test.o
第三步:生成汇编源文件
gcc -S test.c -o test.s
第四步:将生成的目标文件链接成可执行文件
gcc test.o - o test

对于稍微复杂的情况,比如有多个源代码文件、需要链接库或有其他比较特别的要求,就要给定适当的调用选项参数。

例子:整个源代码程序由两个文件 testmain.c 和 testsub.c 组成,程序中使用了系统提供的数学库(所有与浮点相关的数学运算都必须使用数学库)。
gcc testmain.c testsub.c -lm -o test
其中,-lm 表示链接系统的数学库 libm.a

说明:
在编译一个包含许多源文件的工程时,若只用一条gcc命令来完成编译是非常浪费时间的。假如项目中有100个源文件需要编译,并且每个源文件中都包含一万行代码,如果像上面那样仅用一条gcc命令来完成编译工作,那么gcc需要将每个源文件都重新编译一遍,然后再全部链接起来。很显然,这样浪费的时间相当多,尤其是当用户只是修改了其中某个文件的时候,完全没有必要将每个文件都重新编译一遍,因为很多已经生成的目标文件是不会发生改变的。要解决这个问题,需要借助像make这样的工具。

(二) 警告提示功能选项
gcc包含完整的出错检查和警告提示功能,它们可以帮助Linux程序员写出更加专业的代码。
(1) -pedantic 选项
当gcc在编译不符合ANSI/ISO C 语言标准的源代码时,将产生相应的警告信息。

#include <stdio.h> void main(void) { long long int var = 1; printf("It is not standard C code!/n"); }

 

它有以下问题:
> main 函数的返回值被声明为 void,但实际上应该是 int。
> 使用了 GNU 语法扩展,即使用 long long 来声明64位整数,不符合 ANSI/ISO C 语言标准。
> main 函数在终止前没有调用 return 语句。

(2) -Wall 选项
除了 -pedantic 之外,gcc 还有一些其他编译选项,也能够产生有用的警告信息。这些选项大多以 -W 开头。其中最有价值的当数 -Wall 了,使用它能够使 gcc 产生尽可能多的警告信息。

 

gcc 给出的警告信息虽然从严格意义上说不能算作错误,但却和可能成为错误来源。一个优秀的程序员应该尽量避免产生警告信息,使自己的代码始终保持简洁、优美和健壮的特性。
建议:gcc 给出的警告信息是很有价值的,它们不仅可以帮助程序员写出更加健壮的程序,而且还是跟踪和调试程序的有力工具。建议在用 gcc 编译源代码时始终带上 -Wall 选项,并把它逐渐培养成一种习惯,这对找出常见的隐式编程错误很有帮助。

(3) -Werror 选项
在处理警告方面,另一个常用的编译选项是 -Werror。它要求 gcc 将所有的警告当成错误进行处理,这在使用自动编译工具(如 Make 等)时非常有用。如果编译时带上 -Werror 选项,那么 gcc 会在所有产生警告的地方停止编译,迫使程序员对自己的代码进行修改。只有当相应的警告信息消除时,才可能将编译过程继续朝前推进。

 

(4) -Wcast-align 选项
当源程序中地址不需要对齐的指针指向一个地址需要对齐的变量地址时,则产生一个警告。例如,char * 指向一个 int * 地址,而通常在机器中 int 变量类型是需要地址能被2或4整除的对齐地址。

(5) 其他常用选项
-v                            输出 gcc 工作的详细过程
--target-help       显示目前所用的gcc支持CPU类型
-Q                           显示编译过程的统计数据和每一个函数名

(三) 库操作选项
在Linux下开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助一个或多个函数库的支持才能够完成相应的功能。
从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(.so 或 .a)的集合。虽然Linux下的大多数函数都默认将头文件放到 /usr/include/ 目录下,而库文件则放到 /usr/lib/ 目录下,但并不是所有的情况都是这样。正因如此,gcc 在编译时必须有自己的办法来查找所需要的头文件和库文件。常用的方法有:
(1) -I
可以向 gcc 的头文件搜索路径中添加新的目录。
(2) -L
如果使用了不在标准位置的库文件,那么可以通过 -L 选项向 gcc 的库文件搜索路径中添加新的目录。
(3) -l
Linux下的库文件在命名时有一个约定,就是应该以 lib 这3个字母开头,由于所有的库文件都遵循了同样的规范,因此在用 -l 选项指定链接的库文件名时可以省去 lib 这3个字母。例如,gcc 在对 -lfoo 进行处理时,会自动去链接名为 libfoo.so 的文件。
(4) -static
Linux下的库文件分为两大类,分别是:动态链接库(通常以 .so 结尾)和静态链接库(通常以 .a 结尾)。
两者的差别仅在程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。
默认情况下,gcc 在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库。
如果需要的话,可以在编译时加上 -static 选项,强制使用静态链接库。
(5) -shared
生成一个共享的目标文件,它能够与其他的目标一起链接生成一个可执行的文件。
 
(四) 调试选项
对于Linux程序员来讲,gdb(GNU Debugger)通过与 gcc 的配合使用,为基于Linux的软件开发提供了一个完善的调试环境。常用的有:
(1) -g 和 -ggdb
默认情况下,gcc 在编译时不会将调试符号插入到生成的二进制代码中,因为这样会增加可执行文件的大小。如果需要在编译时生成调试符号信息,可以使用 gcc 的 -g 或 -ggdb 选项。
gcc 在产生调试符号时,同样采用了分级的思路,开发人员可以通过在 -g 选项后附加数字1、2、3指定在代码中加入调试信息的多少。默认的级别是2(-g2),此时产生的调试信息包括:扩展的符号表、行号、局部或外部变量信息。
级别3(-g3)包含级别2中的所有调试信息以及源代码中定义的宏。
级别1(-g1)不包含局部变量和与行号有关的调试信息,因此只能够用于回溯跟踪和堆栈转储。
回溯追踪:指的是监视程序在运行过程中函数调用历史。
堆栈转储:则是一种以原始的十六进制格式保存程序执行环境的方法。

注意:使用任何一个调试选项都会使最终生成的二进制文件的大小急剧增加,同时增加程序在执行时的开销,因此,调试选项通常仅在软件的开发和调试阶段使用。

(2) -p 和 -pg
会将剖析(Profiling)信息加入到最终生成的二进制代码中。剖析信息对于找出程序的性能瓶颈很有帮助,是协助Linux程序员开发出高性能程序的有力工具。

(3) -save-temps
保存编译过程中生成的一些列中间文件。
# gcc test.c -o test -save-temps
除了生成执行文件test之外,还保存了test.i 和 test.s 中间文件,供用户查询调试。

(五) 交叉编译选项
通常情况下使用 gcc 编译的目标代码都与使用的机器是一致的,但 gcc 也支持交叉编译的功能,能够编译其他不同CPU的目标代码
使用 gcc 开发嵌入式系统,我们几乎都是以通用的PC机(X86)平台来做宿主机,通过 gcc 的交叉编译功能对其他嵌入式CPU的开发任务。
(具体的选项设置,此处省略)

 

 

 

 

 

 

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