搜档网
当前位置:搜档网 › gcc的使用简介与命令行参数说明

gcc的使用简介与命令行参数说明

gcc的使用简介与命令行参数说明
gcc的使用简介与命令行参数说明

gcc的使用简介与命令行参数说明

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

(二) 警告提示功能选项

(三) 库操作选项

(四) 调试选项

(五) 交叉编译选项(一) gcc的基本用法

使用gcc编译器时,必须给出一系列必要的调用参数和文件名称。不同参数的先后顺序对执行结果没有影响,只有在使用同类参数时的先后顺序才需要考虑。如果使用了多个-L 的参数来定义库目录,gcc会根据多个-L 参数的先后顺序来执行相应的库目录。

因为很多gcc参数都由多个字母组成,所以gcc参数不支持单字母的组合,Linux中常被叫短参数(short options),如-dr 与-d -r 的含义不一样。gcc编译器的调用参数大约有100

多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。gcc最基本的用法是:gcc [options] [filenames]

其中,options就是编译器所需要的参数,filenames给出相关的文件名称,最常用的有以下参数:-c

只编译,不链接成为可执行文件。编译器只是由输入的 .c 等源代码文件生成 .o 为后缀的目标文件,通常用于编译不包含主程序的子程序文件。

-o output_filename

确定输出文件的名称为output_filename。同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出默认的可执行文件a.out 。

-g

产生符号调试工具(GNU的gdb)所必要的符号信息。想要对源代码进行调试,就必须加入这个选项。

-O

对程序进行优化编译、链接。采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是编译、链接的速度就相应地要慢一些,而且对执行文件的调试会产生一定的影响,造成一些执行效果与对应源文件代码不一致等一些令人“困惑”的情况。因此,一般在编译输出软件发行版时使用此选项。

-O2

比-O 更好的优化编译、链接。当然整个编译链接过程会更慢。

-Idirname

将dirname 所指出的目录加入到程序头文件目录列表中,

是在预编译过程中使用的参数。

说明:

C程序中的头文件包含两种情况:

#include

#include "stdio.h"

其中,使用尖括号(<>),预处理程序cpp 在系统默认包含文件目录(如/usr/include)中搜索相应的文件;使用双引号,预处理程序cpp 首先在当前目录中搜寻头文件,如

果没有找到,就到指定的dirname 目录中去寻找。

在程序设计中,如果需要的这种包含文件分别分布在不同的目录中,就需要逐个使用-I 选项给出搜索路径。

-Ldirname

将dirname所指出的目录加入到程序函数库文件的目录列表中,是在链接过程中使用的参数。在默认状态下,链接程序ld 在系统默认路径中(如/usr/lib)寻找所需要的库文件。

这个选项告诉链接程序,首先到-L 指定的目录中去寻找,然后到系统默认路径中寻找;如果函数库存放在多个目录下,就需要依次使用这个选项,给出相应的存放目录。

-lname

链接时装载名为libname.a 的函数库。该函数库位于系统默认的目录或者由-L 选项确定的目录下。例如,-lm 表示链接名为libm.a 的数学函数库。例子:假定有一个程序名为test.c 的C语言源代码文件,要生成一个可执行文件。

#include

int main(void)

{

printf("Hello world/n");

return 0;

}

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

首先,gcc需要调用预处理程序cpp,由它负责展开在源文

件中定义的宏,并向其中插入“#include”语句所包含的内容;接着,gcc调用

ccl 和as,将处理后的源代码编译成目标代码;最后,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 语言标准的源代码时,将

产生相应的警告信息。

[cpp] view plain copy print?#include 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的开发任务。

(具体的选项设置,此处省略)GCC常用参数详解简介gcc and g++现在是gnu中最主要和最流行的c & c++编译器 .gcc/g++在执行编译工作的时候,总共需要以下几步:

1.预处理,生成.i的文件[预处理器cpp]

2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]

3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]

4.连接目标代码,生成可执行程序[链接器ld]GCC能够处理的后缀有:

a. *.c *.C (C语言)

b. *.cxx *.cc (C++语言)

c. *.m (面向对象的C)

d. *.i (预处理后的C语言源文件)

e. *.ii (预处理后的C++语言源文件)

f. *.s *.S (汇编语言)

h. *.h (头文件)目标文件可以是:

a. *.o 编译连接后的目标文件

b. *.a 库文件

gcc与g++有什么区别?

gcc和g++都是GNU(组织)的一个编译器。误区一:gcc只能编译c代码,g++只能编译c++代码

两者都可以,但是请注意:

1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。

2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。

误区二:gcc不会定义__cplusplus宏,而g++会

实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。

误区三:编译只能用gcc,链接只能用g++

严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc

-lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。参数详解

无选项编译链接

将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。

例子用法:

gcc test.c无选项链接

gcc test.o -o test

将编译输出文件test.o链接成最终可执行文件test。-x language filename

设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很个性,

决定你的C代码文件的后缀名是.pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数的使用。

可以使用的参数吗有下面的这些

`c', `objective-c', `c-header', `c++', `cpp-output',

`assembler', and `assembler-with-cpp'.

看到英文,应该可以理解的。

例子用法:

gcc -x c hello.pig

-x none filename

关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型

例子用法:

gcc -x c hello.pig -x none hello2.c

-c

只激活预处理,编译,和汇编,也就是他只把程序做成obj

文件

例子用法:

gcc -c hello.c

他将生成.o的obj文件

gcc -c test.s

将汇编输出文件test.s编译输出test.o文件。-S

只激活预处理和编译,就是指把文件编译成为汇编代码。

例子用法:

gcc -S hello.c

他将生成.s的汇编代码,你可以用文本编辑器察看

gcc -S test.i

将预处理输出文件test.i汇编成test.s文件-E

只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.

例子用法:

gcc -E hello.c >; pianoapan.txt

gcc -E hello.c | more

慢慢看吧,一个hello word 也要与处理成800行的代码

gcc -E test.c -o test.i -o

制定目标名称,缺省的时候,gcc 编译出来的文件是

a.out,很难听,如果你和我有同感,改掉它,哈哈

例子用法:

gcc -o hello.exe hello.c (哦,windows用习惯了)

gcc -o hello.asm -S hello.c -pipe

使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题

gcc -pipe -o hello.exe hello.c -ansi

关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一些asm inline typeof关键字,以及UNIX,vax 等预处理宏, -fno-asm

此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。

-fno-strict-prototype

gcc编译器使用简明指南

gcc编译器使用简明指南 gcc对文件的处理需要经过预处理->编译->汇编->链接的步骤,从而产生一个可执行文件,各部分对应不同的文件类型,具体如下: file.c c程序源文件 file.i c程序预处理后文件 file.cxx c++程序源文件,也可以是https://www.sodocs.net/doc/95832471.html, / file.cpp / file.c++ file.ii c++程序预处理后文件 file.h c/c++头文件 file.s 汇编程序文件 file.o 目标代码文件 gcc [选项]文件列表 -ansi 强制完全ANSI一致 -c 仅编译或汇编,生成目标代码文件,将.c、.i、.s等文件生成.o文件,其余文件被忽略 -S 仅编译,不进行汇编和链接,将.c、.i等文件生成.s文件,其余文件被忽略 -E 仅预处理,并发送预处理后的.i文件到标准输出,其余文件被忽略 -o file 创建可执行文件并保存在file中,而不是默认文件a.out -g 产生用于调试和排错的扩展符号表,用于GDB调试,切记-g和-O通常不能一起使用 -w 取消所有警告 -W 给出更详细的警告 -O [num]优化,可以指定0-3作为优化级别,级别0表示没有优化 -x language 默认为-x none,即依靠后缀名确定文件类型,加上-x lan确定后面所有文件类型,直到下一个-x出现为止 -D macro[=]类似于源程序里的#define,在-D macro中的macro可被源程序识别,例如gcc -D NUM -D FILE=\"bbs.txt\" hello.c -o hello,第一个-D选项定义宏NUM,在程序中可以使用#ifdef来检查是否被设置,第二个-D定义宏FILE,在源程序中可用 -U macro 类似于源程序开头定义#undef macro,也就是取消源程序中的某个宏定义

调试MASM程序技巧及参数详解

1.首先要设置好include、path、lib的路径,可以写成bat文件,如masm安装在D盘,则内容如下 @echo off set include=d:\masm32\Include set lib=d:\masm32\lib set path=d:\masm32\bin;%path% echo on 运行bat文件以后,在dos shell窗口用path命令检查一下。 2.ML问题,对于如下代码, MOV AX, @data MOV DS, AX 编译的时候用ml /c /coff *****.asm 总是出现error A2006: undefined symbol : DGROUP错误信息。 原因在于这种古老的进入程序的代码段的方法在coff格式中已经不用了,因为“/coff ”参数,这是生成32位Windows程序的模块格式,并不适合编译dos程序。至于用什么方法,还得参考PE格式。 COFF –通用对象文件格式(Common Object File Format),是一种很流行的对象文件格式(注意:这里不说它是“目标”文件,是为了和编译器产生的目标文件(*.o/*.obj)相区别,因为这种格式不只用于目标文件,库文件、可执行文件也经常是这种格式)。大家可能会经常使用VC吧?它所产生的目标文件(*.obj)就是这种格式。其它的编译器,如GCC(GNU Compiler Collection)、ICL(Intel C/C++ Compiler)、VectorC,也使用这种格式的目标文件。不仅仅是C/C++,很多其它语言也使用这种格式的对象文件。统一格式的目标文件为混合语言编程带来了极大的方便。 当然,并不是只有这一种对象文件格式。常用格式的还有OMF-对象模型文件(Object Module File)以及ELF-可执行及连接文件格式(Executable and Linking Format)。OMF是一大群IT巨头在n年制定的一种格式,在Windows平台上很常见。大家喜欢的Borland公司现在使用的目标文件就是这种格式。MS和Intel在n年前用的也是这种格式,现在都改投异侧,用COFF格式了。ELF格式在非Windows平台上使用得比较多,在Windows平台基本上没见过。 3.LINK问题 如果用Link /subsystem:(随便哪种系统) *****.obj链接,出现以下提示: LINK : error : Segment reference in fixup record hello.obj : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt 问题就出在Linker上,注意两个Linker的不同 Microsoft (R) Segmented Executable Linker Microsoft (R) Incremental Linker 解释一下, Windows平台下, 源代码编译出来的obj主要有两种格式:OMF和COFF, 其中, OMF格式是原来IBM(好像是吧, 不记得了)使用的格式, 而COFF格式则是从微软从UNIX移植过来的, 因为微软公司开发Windows的软件工程师大多对UNIX很熟, 所以自然而然的采用了类似UNIX COFF的这种Win32 COFF格式(和UNIX的"纯种"COFF 是有区别的, 但仍然叫COFF格式) DOS程序编译的obj文件都是omf格式的, omf格式的obj要用Segmented Linker链接, 生成的是DOS可执行文件或者NE文件, 而Win32程序编译的obj必须是COFF格式

gcc语言编译原理_CompilingBinaryFilesUsingACompiler

Making plain binary?les using a C compiler(i386+) Cornelis Frank April10,2000 I wrote this article because there isn’t much information on the Internet concerning this topic and I needed this for the EduOS project. No liability is assumed for incidental or consequential damages in connection with or arising out of use of the information or programs contained herein. So if you blow up your computer because of my bad“English”that’s your problem not mine. 1Which tools do you need? An i386PC or higher. A Linux distribution like Red Hat or Slackware. GNU GCC compiler.This C compiler usually comes with Linux.To check if you’re having GCC type the following at the prompt: gcc--version This should give an output like: 2.7.2.3 The number probably will not match the above one,but that doesn’t really matter. The binutils for Linux. NASM Version0.97or higher.The Netwide Assembler,NASM,is an80x86assembler designed for portability and modularity.It supports a range of object?le formats,including Linux‘a.out’and ELF,NetBSD/FreeBSD,COFF,Microsoft16-bit OBJ and Win32.It will also output plain binary?les.Its syntax is designed to be simple and easy to understand, similar to Intel’s but less complex.It supports Pentium,P6and MMX opcodes,and has macro capability. Normally you don’t have NASM on your system.Download it from: https://www.sodocs.net/doc/95832471.html,/pub/Linux/devel/lang/assemblers/ A text editor like pico or emacs.

嵌入式名词解释

1.名词解释 RISC:英文全称是Reduced Instruction Set Computer,中文是精简指令集计算机。特点是所有指令的格式都是一致的,所有指令的指令周期也是相同的,并且采用流水线技术。CISC:Complex Instruction Set Computer 复杂指令计算机 GPIO:General Purpose Input Output (通用输入/输出)简称为GPIO,或总线扩展器,利用工业标准I2C、SMBus或SPI接口简化了I/O口的扩展。 MTBF:Mean Time Between Failure平均无故障时间,是衡量一个产品的可靠性指标。 E2PROM:EEPROM (Electrically Erasable Programmable Read-Only Memory),电可擦可编程只读存储器。 EPROM:Erasable Programmable Read Only Memory 可擦除可编程只读存储器。 DSP:digital signal processor数字信号处理器 gcc: GNU Compiler Collection GNU编译器套件 MIPS:Million Instructions Per Second 单字长定点指令平均执行速度 DMA: Directional Memory Access直接内存访问 A/D:将模拟信号转换成数字信号的过程称为模数转换(Analog to Digital)或称A/D转换。能够完成这种转换的电路称为模数转化器(Analog Digital Converter),简称ADC. D/A:将数字信号转换成模拟信号的过程称为数模转换(Digital to Analog)或称D/A转换。能够完成这种转换的电路称为数模转化器(Digital Analog Converter),简称DAC. 2. linux 命令 //linux 命令主要参考上课上机的word文档中,考试中90%左右的命令来自于本命令文档。 ●ls列出当前目录下的所有文件和子目录。 ?ls -l; ls -l 列出文件的详细信息.如创建者,创建时间,文件的读写权限列表等 等 ls -a:显示目录下所有文件,包括隐含文件(头部带“.”的文件)。 ?ls -la/-al(就是把前两个合并)列出所有文件(包括隐含文件)的详细信息 ●pwd显示当前目录 ●mkdir一次建立一个或几个目录 ●cp 复制文件和目录 ?cp file1 dir1把文件file1复制到dir1目录下 ?cp file1 file2把file1复制给file2 ●mv移动文件 ?mv file1 file2把file1重命名为file2 ?mv file1 dir1把file1移动到dir1目录下

比特币0.9.2版编译中文手册

比特币0.9.2中文版编译手册 日期:2014-07-01 构建比特币源码,是一件十分费时费力的工作,尤其在windows系统中编译比特币源码更加的麻烦,经过一两天努力,终于在windows7 64位系统中成功编译出了比特币源文件。现在总结如下,首先准备一套干净的windows7 64位操作系统,最好是使用vbox或者vmware 虚拟机建立一个专用系统,这样的可以防止其它干扰导至编译失败,接下来说说,我的编译过程: 1.安装msys系统 msys作用是在windows系统中重建linux系统编译环境,在msys系统下操作,就像linux 中的操作一样,具有相同的语法命令。从下面的网址中下载msys最新版: https://www.sodocs.net/doc/95832471.html,/projects/mingw/files/Installer/mingw-get-setup.exe/download 然后运行mingw-get-setup.exe文件后,选择安装目录为H:\MinGW,之后软件会首先更新下载库,更新成功会弹出一个窗口MinGW installation manager,在这个窗口中,只下载msys相关的包文件,不要下载mingw相关文件,因为不使用它带的这个mingw。 主要如下面所示: msys-base-bin msys-autoconf-bin msys-automake-bin msys-libtool-bin 选择好之后,点击Installation->Apply changes即可。一定要确保mingw包没有被下载,这里我们只需要msys相关系统,也要确保msys-gcc和msys-w32api等包没有被下载,否则当我们执行编译时,可能会调用这些不该出现的包文件,而导至编译失败。 2.安装perl系统 由于在编译比特币时,需要调用一些perl脚本,所以从下面的网址中下载一个perl安装程序,然后安装即可。 https://www.sodocs.net/doc/95832471.html,/ActivePerl/releases/5.18.1.1800/ActivePerl-5.18.1.1800-M SWin32-x64-297570.msi

1、GCC编译器的使用

linux下gcc编译器的使用 1、文件后缀名 .c C 源程序 .C C++ 源程序 .cc C++ 源程序 .cxx C++ 源程序 .m Objective –C源程序 .i 预处理过的c源程序 .ii 预处理过的C++源程序 .s 组合语言源程序 .S 组合语言源程序 .h 头文件 .o 目标文件 .a 存档文件 2、GCC常用选项 -c 通知GCC取消链接步骤,即编译源码并在最后生成目标文件; -Dmacro定义指定的宏,使它能够通过源码中的#ifdef进行检验 #define -static 指定程序编译时采用静态编译的方法; -E 不经过编译预处理程序的输出而输送至标准输出; -g获得有关调试程序的详细信息,它不能与-o选项联合使用; -Idirectory在包含文件搜索路径的起点处添加指定目录; -llibrary提示链接程序在创建最终可执行文件时包含指定的库; -O、-O2、-O3将优化状态打开,该选项不能与-g选项联合使用; -S要求编译程序生成来自源代码的汇编程序输出; -v启动所有警报; -Wall发生警报时取消编译操作,即将警报看作是错误; -Werror在发生警报时取消编译操作,即把报警当作是错误; -w 禁止所有的报警。 目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、 Fortran、Pascal、Modula-3和Ada等。开放、自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程。

详解-C语言可变参数-va-list和-vsnprintf及printf实现

C语言的变长参数在平时做开发时很少会在自己设计的接口中用到,但我们最常用的接口printf就是使用的变长参数接口,在感受到printf强大的魅力的同时,是否想挖据一下到底printf是如何实现的呢这里我们一起来挖掘一下C语言变长参数的奥秘。 先考虑这样一个问题:如果我们不使用C标准库(libc)中提供的Facilities,我们自己是否可以实现拥有变长参数的函数呢我们不妨试试。 一步一步进入正题,我们先看看固定参数列表函数, void fixed_args_func(int a, double b, char *c) { printf("a = 0x%p\n", &a); printf("b = 0x%p\n", &b); printf("c = 0x%p\n", &c); } 对于固定参数列表的函数,每个参数的名称、类型都是直接可见的,他们的地址也都是可以直接得到的,比如:通过&a我们可以得到a的地址,并通过函数原型声明了解到a是int 类型的; 通过&b我们可以得到b的地址,并通过函数原型声明了解到b是double类型的; 通过&c我们可以得到c的地址,并通过函数原型声明了解到c是char*类型的。 但是对于变长参数的函数,我们就没有这么顺利了。还好,按照C标准的说明,支持变长参数的函数在原型声明中,必须有至少一个最左固定参数(这一点与传统C有区别,传统C允许不带任何固定参数的纯变长参数函数),这样我们可以得到其中固定参数的地址,但是依然无法从声明中得到其他变长参数的地址,比如: void var_args_func(const char * fmt, ... ) { ... ... } 这里我们只能得到fmt这固定参数的地址,仅从函数原型我们是无法确定"..."中有几个参数、参数都是什么类型的,自然也就无法确定其位置了。那么如何可以做到呢在大脑中回想一下函数传参的过程,无论"..."中有多少个参数、每个参数是什么类型的,它们都和固定参数的传参过程是一样的,简单来讲都是栈操作,而栈这个东西对我们是开放的。这样一来,一旦我们知道某函数帧的栈上的一个固定参数的位置,我们完全有可能推导出其他变长参数的位置,顺着这个思路,我们继续往下走,通过一个例子来诠释一下:(这里要说明的是:函数参数进栈以及参数空间地址分配都是"实现相关"的,不同平台、不同编译器都可能不同,所以下面的例子仅在IA-32,Windows XP, MinGW gcc v3.4.2下成立) 我们先用上面的那个fixed_args_func函数确定一下这个平台下的入栈顺序。 int main() { fixed_args_func(17, , "hello world"); return 0; } a = 0x0022FF50 b = 0x0022FF54

GLD中文手册

标题: GLD中文手册--前言 前段时间从每天十多个小时的工作时间中挤出那么点时间完成了NASM手册的翻译,之后得到了汇编版很多朋友的支持与关心,心中非常感激。 但是我们知道,NASM只是一个汇编器,只有它我们还无法完成我们的工作,NASM 功能很强大,能生成很多目标格式的文件,但是得不到我们最终想要的可执行文件。对,我们还需要一个连接器。 可供选择的连接器有很多,它们当中也有很多是免费的,这在NASM的手册中也有介绍,这里我选择的是GNU的连接器ld,为了能更好地使用这个工具,就有了这篇翻译文档。 请不要误会,gld并不只能运行在unix/linux系统下面。GCC的windows版本djgpp带有ld的windows版本,可以通过互联网免费下载。 希望这篇文档能对大家有所帮助,谢谢。 标题: GLD中文手册--(一) 使用ld ******** 本文档介绍GNU连接器ld的2.14版本. 本文档在GNU自由文档许可证下发行.在"GNU自由文档许可证"一章中有关于本 许可证的一份拷贝. 概述 ******** 'ld'把一定量的目标文件跟档案文件连接起来,并重定位它们的数据,连接符号 引用.一般,在编译一个程序时,最后一步就是运行'ld'. 'ld'能接受连接命令语言文件,这是一种用AT&T的连接编辑命令语言的超集写 成的文件,用来在连接的整个过程中提供显式的,全局的控制. 本版本的'ld'使用通用BFD库来操作目标文件.这就允许'ld'读取,合并,写入目标文件时,可以使用各种不同的格式,比如,COFF或'a.out'. 不同的格式可以被 连接到一起产生一个有效的目标文件. 除了它的灵活性,GNU连接器比其它连接器更有用的地方在于它提供了诊断信息. 许多连接器在碰到一个错误的时候立即放弃执行;但'ld'却能够继续执行,以让 你发现其他的错误(或者,在某些情况下,得到一个带有错误的输出文件) 引用 ********** GNU连接器'ld'能够处理大量的不同情况,并且跟其他的连接器保持尽可能的兼容.这样,你就拥有更多的选择来控制它的行为. 命令行选项 ==================== 连接器提供大量的命令行选项,但是,在实际使用中,只有少数被经常使用.比 如,'ld'的一个经常的使用场合是在一个标准的Unix系统上连接标准的Unix目标文件.在这样的一个系统上,连接文件'hello.o'如下: ld -o OUTPUT /lib/crt0.o hello.o -lc

实验三 vi编辑器及GCC编译器的使用

实验三vi编辑器及GCC编译器的使用 【实验目的】 一、掌握文本编辑器vi的使用方法 二、了解GNU gcc编译器 三、掌握使用GCC编译C语言程序的方法 【实验内容】 一、vi的三种工作模式: 1、命令模式: 执行相关文本编辑命令 2、输入模式: 输入文本 3、末行模式: 实现查找、替换、保存、多文件操作等等功能 二、进入vi,直接在Shell提示符下键入vi [文件名称],如果该文件在当前目录不存在,则vi创建之。 三、退出vi 1、在命令模式下输入“: wq”,保存文件并退出vi 2、若不需要保存文件,输入“: q” 3、若文件已修改,但不保存,输入“:

q!”强制退出vi 4、其它一些不常用的方法在此省略。 四、命令模式下的常用编辑命令 1、启动vi后,进入的是vi的命令模式 2、按i键,进入输入模式,可以进行文本的编辑,在输入模式下,按esc 键,可切换回命令模式 i: 光标位置不变,可在光标左侧插入正文 a: 光标位置向后退一格,可在光标左侧插入正文 o: 在光标所在行的下一行增添新行 O: 在光标所在行的上一行增添新行 I: 光标跳到当前行的开头 A: 光标跳到当前行的末尾 3、光标的移动 k、j、h、l分别等同于上、下、左、右箭头键 Ctrl+b,向上翻一页

Ctrl+f,向下翻一页 nH,将光标移到屏幕的第n行 nL,将光标移到屏幕的倒数第n行 4、删除文本 nX,删除光标所指向的后n个字符 D,删除光标右侧的所有字符(包括光标所指向的字符)db,删除光标左侧的全部字符 ndd,删除当前行和当前行以后的n行内容 5、粘贴和复制 p,将缓冲区的内容粘贴到当前字符的右侧 P,将缓冲区的内容粘贴到当前字符的左侧 yy,复制当前行到内存缓冲区 nyy,复制n行内容到内存缓冲区 6、搜索字符串 /str1,正向搜索字符串str1 n,继续搜索 ?str2,反向搜索字符串str2 7、撤销和重复 u,撤销前一条命令的执行结果 .,重复最后一条命令

GCC 命令行详解

GCC 命令行详解 1。gcc包含的c/c++编译器 gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译 2。gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序 gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指定生成程序的名字 3。为什么会出现undefined reference to 'xxxxx'错误? 首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm。 4。-l参数和-L参数 -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。好了现在我们知道怎么得到库名了,比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)。放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果

库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它放在/usr/X11R 6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc 目录下,那链接参数就是-L/aaa/bbb/ccc -ltest另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.so.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so,如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了ln -s libxxxx-x.x.x.so libxxxx.so手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如gtk1.2的链接参数生成程序是gtk-config,执行gtk-config --libs就能得到以下输出" -L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm",这就是编译一个gtk1.2程序所需的gtk链接参数,xx-config除了--libs参数外还有一个参数是--cflags用来生成头文件包含目录的,也就是-I参数,在下面我们将会讲到。你可以试试执行gtk-config --libs --cflags,看看输出结果。现在的问题就是怎样用这些输出结果了,最笨的方法就是复制粘贴或者照抄,聪明的办法是在编译命令行里加入这个`xxxx-config --libs --cflags`,比如编译一个gtk程序:gcc gtktest.c `gtk-config --libs --cflags`这样就差不多了。注意`不是单引号,而是1键

valgrind中文手册

/* valgrind-3.5.0 编译和安装技巧 * author: lblong * date : 20100530 * */ 安装步骤: 1、从valgrind官网上获得代码(也可以通过下载tar包获得源代码,可以点击这里下载) https://www.sodocs.net/doc/95832471.html,/downloads/current.html#current 2、进入源代码目录 3、运行./autogen.sh设置环境(需要标准的autoconf工具) 4、运行./configure配置V algrind,具体参数信息详见INSTALL文件。一般只需要设置--prefix=/where/you/want/it/installed 5、make,编译V algrind 6、make install,安装V algrind 详细: 1. linux 环境下执行./configure telstar:/sybase/telstar/user/lblong/memory/valgrind-3.5.0 > ./configure checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for gawk... gawk checking whether make sets $(MAKE)... yes checking whether to enable maintainer-specific portions of Makefiles... no checking whether ln -s works... yes checking for gcc... cc checking for C compiler default output file name... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether cc accepts -g... yes checking for cc option to accept ANSI C... none needed checking for style of include used by make... GNU checking dependency style of cc... gcc3 checking whether cc understands -c and -o together... yes checking how to run the C preprocessor... cc -E

linux系统下C编译器GCC入门

linux系统下C编译器— gcc 入门 <一>gcc简介 Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。gcc编译器能将C、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是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,. S为后缀的汇编语言源代码文件和汇编,.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。 <三>gcc的基本用法和选项 在使用gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。g cc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。

《Linux操作系统》实验十-UNIX gcc编译器的使用与编程环境

《Linux操作系统》 实验报告 实验十:UNIX gcc编译器的使 用与编程环境

一、实验目的 (1)掌握gcc和g++的用法; (2)了解目标代码、库函数的使用; (3)掌握静态库和共享库的构造与使用; (4)掌握多模块和多语言联合开发方法; (5)掌握make命令和Makefile文件的使用。 二、实验环境 一台装有Windows操作系统PC机,上装有虚拟机系统VMWare,实验过程通过VMWare系统启Linux系统工作。 三、实验内容与实验过程及分析 一、C/C++编程 1、C语言版“Hello World” 用vi编辑一个名为hello.c的文件,其内容为 #include main() { printf(”Hello World! C\n”); } 编译并执行程序。 编译方法为: cc hello.c // 生成可执行程序 a.out cc –o hello hello.c // 生成可执行程序hello cc –c hello.c //生成目标文件hello.o cc –S hello.c //生成汇编语言程序hello.s 执行程序: ./a.out #执行当前目录内,刚编译生成的a.out程序 ./hello #执行当前目录内,刚编译生成的hello程序

2、组合编程 设有C语言文件f1.c,内容为: #include f1(int arg){ printf(”f1: you passed %d\n”,arg); } C语言文件f2.c。内容为: #include f2(char *arg){ printf(”f2: you passed %s\n”,arg); } C语言文件m.c。内容为: #include main(){ f1(16); f2(”Hello World!”); } 请使用vi编辑并生成以上程序,分别用以下方法编译,观察生成文件或运行生成的可执行程序: cc –c f1.c f2.c #生成 f1.o 和 f2.o cc –S f1.c f2.c # 生成 f1.s 和 f2.s;可用vi或cat查看它们的内容cc –o mp m.c f1.c f2.c # 生成mp,执行方法为:./mp cc –o m m.c f1.o f2.o # 生成m,执行方法为:./m

GCC中文手册

GCC中文手册 GCC Section: GNU Tools (1) Updated: 2003/12/05 Index Return to Main Contents NAME gcc,g++-GNU工程的C和C++编译器(egcs-1.1.2) 总览(SYNOPSIS) gcc[option|filename]... g++[option|filename]... 警告(WARNING) 本手册页内容摘自GNU C编译器的完整文档,仅限于解释选项的含义. 除非有人自愿维护,否则本手册页不再更新.如果发现手册页和软件之间有所矛盾,请查对Info文件, Info 文件是权威文档. 如果我们发觉本手册页的内容由于过时而导致明显的混乱和抱怨时,我们就停止发布它.不可能有其他选择,象更新Info文件同时更新man手册,因为其他维护GNU CC的工作没有留给我们时间做这个. GNU工程认为man手册是过时产物,应该把时间用到别的地方. 如果需要完整和最新的文档,请查阅Info文件`gcc'或Using and Porting GNU CC (for version 2. 0) (使用和移植GNU CC 2.0) 手册.二者均来自Texinfo原文件gcc.texinfo. 描述(DESCRIPTION)

C和C++编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking).源文件后缀名标识源文件的语言,但是对编译器来说,后缀名控制着缺省设定: gcc 认为预处理后的文件(.i)是C文件,并且设定C形式的连接. g++ 认为预处理后的文件(.i)是C++文件,并且设定C++形式的连接. 源文件后缀名指出语言种类以及后期的操作: .c C源程序;预处理,编译,汇编 .C C++源程序;预处理,编译,汇编 .cc C++源程序;预处理,编译,汇编 .cxx C++源程序;预处理,编译,汇编 .m Objective-C源程序;预处理,编译,汇编 .i预处理后的C文件;编译,汇编 .ii预处理后的C++文件;编译,汇编 .s汇编语言源程序;汇编 .S汇编语言源程序;预处理,汇编 .h预处理器文件;通常不出现在命令行上 其他后缀名的文件被传递给连接器(linker).通常包括: .o目标文件(Object file) .a归档库文件(Archive file) 除非使用了-c, -S,或-E选项(或者编译错误阻止了完整的过程),否则连接总是最后的步骤.在连接阶段中,所有对应于源程序的.o文件, -l库文件,无法识别的文件名(包括指定的.o目标文件和.a库文件)按命令行中的顺序传递给连接器.

arm-linux-gcc 常用参数讲解 gcc编译器使用方法

arm-linux-gcc常用参数讲解gcc编译器使用方法 我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为arm-linux-gcc。下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。 在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为四个阶段: 1. 预处理(Pre-Processing) 2. 编译(Compiling) 3. 汇编(Assembling) 4. 链接(Linking) Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。 以文件example.c为例说明它的用法 0. arm-linux-gcc -o example example.c 不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。 -o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出 a.out 1. arm-linux-gcc -c -o example.oexample.c -c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.0文件 去掉指定输出选项"-o example.o"自动输出为example.o,所以说在这里-o加不加都可以 2.arm-linux-gcc -S -o example.sexample.c -S参数将对源程序example.c进行预处理、编译,生成example.s文件 -o选项同上 3.arm-linux-gcc -E -o example.iexample.c -E参数将对源程序example.c进行预处理,生成example.i文件(不同版本不一样,有的将预处理后的内容打印到屏幕上) 就是将#include,#define等进行文件插入及宏扩展等操作。 4.arm-linux-gcc -v -o example example.c 加上-v参数,显示编译时的详细信息,编译器的版本,编译过程等。 5.arm-linux-gcc -g -o example example.c -g选项,加入GDB能够使用的调试信息,使用GDB调试时比较方便。 6.arm-linux-gcc -Wall -o example example.c -Wall选项打开了所有需要注意的警告信息,像在声明之前就使用的函数,声明后却没有使用的变量等。 7.arm-linux-gcc -Ox -o example example.c -Ox使用优化选项,X的值为空、0、1、2、3 0为不优化,优化的目的是减少代码空间和提高执行效率等,但相应的编译过程时间将较长并占用较大的内存空间。 8.arm-linux-gcc -I /home/include -o example example.c -Idirname: 将dirname所指出的目录加入到程序头文件目录列表中。如果在预设系统及当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。 9.arm-linux-gcc -L /home/lib -o example example.c

gcc命令行详解

gcc命令行详解 1、gcc包含的c/c++编译器 gcc、cc、c++、g++ gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译 2、gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序 gcc test.c -o test这样将编译出一个名为test的程序 -o参数用来指定生成程序的名字 3、为什么会出现undefined reference to 'xxxxx'错误? 首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm 4、-l参数和-L参数 -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?-lname,在连接时,装载名字为“libname.a”的函数库:-lm表示连接名为“libm.a”的数学函数库。就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了 好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件) 放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是 -L/aaa/bbb/ccc -ltest 另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.s o.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so, 如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx 库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了 ln -s libxxxx-x.x.x.so libxxxx.so 手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如 gtk1.2的链接参数生成程序是gtk-config,执行gtk-config --libs就能得到以下输出"- L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic

相关主题