GCC常用编译命令
- 格式:docx
- 大小:16.27 KB
- 文档页数:4
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经预处理之后的代码。
gcc 编译指令
GCC(GNU Compiler Collection)是一个开源的编译器套件,用于编译和生成可执行文件。
它支持多种编程语言,如C、C++、Objective-C、Fortran等。
下面是一些常用的GCC编译指令:编译C源文件并生成可执行文件:
gcc source.c -o output
编译C++源文件并生成可执行文件:
g++ source.cpp -o output
指定编译优化级别(例如-O2):
gcc source.c -o output -O2
生成调试信息(用于调试程序):
gcc source.c -o output -g
链接其他库文件:
gcc source.c -o output -l library
指定包含头文件的目录:
gcc source.c -o output -I include_directory
生成位置无关代码(用于动态链接):
gcc source.c -o output -fPIC
生成静态库文件:
gcc -c source.c
ar rcs libname.a source.o
这些只是一些常用的GCC编译指令示例,GCC还支持更多的编译选项和功能。
你可以查阅GCC的官方文档或使用gcc --help命令获取更多的信息和使用方法。
gcc编译指令⼀. 常⽤编译命令选项假设源程序⽂件名为test.c。
1. ⽆选项编译链接⽤法:#gcc test.c 作⽤:将test.c预处理、汇编、编译并链接形成可执⾏⽂件。
这⾥未指定输出⽂件,默认输出为a.out。
2. 选项 -o ⽤法:#gcc test.c -o test 作⽤:将test.c预处理、汇编、编译并链接形成可执⾏⽂件test。
-o选项⽤来指定输出⽂件的⽂件名。
3. 选项 -E ⽤法:#gcc -E test.c -o test.i 作⽤:将test.c预处理输出test.i⽂件。
4. 选项 -S ⽤法:#gcc -S test.i 作⽤:将预处理输出⽂件test.i汇编成test.s⽂件。
5. 选项 -c ⽤法:#gcc -c test.s 作⽤:将汇编输出⽂件test.s编译输出test.o⽂件。
6. ⽆选项链接⽤法:#gcc test.o -o test 作⽤:将编译输出⽂件test.o链接成最终可执⾏⽂件test。
7. 选项-O ⽤法:#gcc -O1 test.c -o test 作⽤:使⽤编译优化级别1编译程序。
级别为1~3,级别越⼤优化效果越好,但编译时间越长。
⼆. 多源⽂件的编译⽅法如果有多个源⽂件,基本上有两种编译⽅法: [假设有两个源⽂件为test.c和testfun.c]1. 多个⽂件⼀起编译⽤法:#gcc testfun.c test.c -o test 作⽤:将testfun.c和test.c分别编译后链接成test可执⾏⽂件。
2. 分别编译各个源⽂件,之后对编译后输出的⽬标⽂件链接。
⽤法: #gcc -c testfun.c //将testfun.c编译成testfun.o #gcc -c test.c //将test.c编译成test.o #gcc -o testfun.o test.o -o test //将testfun.o和test.o链接成test以上两种⽅法相⽐较,第⼀中⽅法编译时需要所有⽂件重新编译,⽽第⼆种⽅法可以只重新编译修改的⽂件,未修改的⽂件不⽤重新编译。
linuxgcc命令及用法Linux的gcc命令是一款非常强大的编译器,用于将源代码转换为可执行文件。
本文将详细介绍gcc命令及其常用的用法,帮助读者更好地理解和使用这款工具。
一、gcc命令的基本语法结构gcc是GNU Compiler Collection(GNU编译器集合)的简称,因此其命令基本语法结构一般为:shellgcc [选项] [输入文件]其中,选项用于指定编译时的相关参数,输入文件则是需要编译的源文件。
二、gcc命令的常用选项gcc命令提供了许多选项,用于控制编译过程及生成的可执行文件的属性。
下面是一些常用的gcc选项及其作用:1. -o:用于指定输出文件的名称。
例如,使用`-o myprogram`选项将输出文件命名为myprogram。
2. -c:仅进行编译,不进行链接操作。
这个选项常用于编译多个源文件时,先将每个源文件编译为目标文件,再进行链接操作。
3. -g:生成调试信息。
这个选项会在编译时生成与调试器兼容的调试信息,方便开发人员进行程序调试。
4. -Wall:显示所有警告信息。
使用这个选项可以使编译器在编译时输出更多的警告信息,帮助开发人员提前发现潜在的问题。
5. -I:指定头文件的搜索路径。
使用这个选项可以告诉编译器在指定的路径中查找头文件,方便引用外部库、模块等。
6. -L:指定库文件的搜索路径。
与-I选项类似,这个选项用于告诉编译器在指定的路径中查找库文件,用于链接时的库文件搜索。
7. -l:指定要链接的库文件。
使用这个选项可以显式地告诉编译器要链接的库文件,如:-lmath将链接math库文件。
三、gcc命令的应用实例下面通过几个实例来演示gcc命令的具体用法,以帮助读者更好地理解和掌握这款工具。
1. 编译单个源文件并生成可执行文件假设我们有一个名为`hello.c`的源文件,内容如下:c#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}我们可以使用以下命令将其编译为可执行文件`hello`:shellgcc -o hello hello.c编译成功后,即可在当前目录下生成名为`hello`的可执行文件。
GCC常⽤的编译、链接选项GCC 的命令的权威解释还是要查询官⽅⽹站,同时⼀些链接选项不⽅便在⽹站上查询可以利⽤操作系统的 man 指令来查询(⽐如 man ld),这⾥记录⼀些常⽤选项,不定时更新。
1.最常⽤的选项: -o file 输出⽬标⽂件; -E 将源⽂件进⾏预处理;gcc -E test.c -o test.i -S 将源⽂件进⾏汇编处理;gcc -S test.c -o test.s -c 编译源⽂件;gcc -c test.c -o test.o 最终链接步骤:gcc test1.o test2.o test3.o -o test -Wall 打开所有的警告gcc -c test.c -Wall -o test -O打开优化选项: -O0 (默认)减少编译时间,⽣成 debug 级别的结果; -O1/O2/O3 优化级别逐级上升,⼀般 release 版本的优化等级都会采⽤ O2 级别;gcc -c test.c -O2 -o test -g ⽣成当前系统本地格式化的调试信息, GDB 可识别并调试; -ggdb 专门为 gdb ⽣成调试信息;gcc test.c -o test -ggdb test -shared ⽣成⼀个可执⾏⽂件可以动态链接的共享库,这是个链接选项,编译⽣成共享库的⽬标⽂件的源⽂件时通常需要添加编译选项 -fpic; -fpic ⽣成位置⽆关代码,在编译共享库的⽬标⽂件时使⽤,这是⼀个编译选项;gcc -c test.c -o test.o -fpicgcc -shared -o libtest.so test.o -I(⼤写 i) (-Idir 或者 -I dir)添加头⽂件搜索⽬录, 这是⼀个编译选项;test.c 包含 test.h, test.h 位于./inc 中gcc -c test.c -o test.o -I inc -l(⼩写L) (-llib 或者 -l lib)执⾏链接时的共享库名称,如当前有⼀个共享库 libcshare.so, 那么链接命令如下:gcc test.c -o test -lcshare 或gcc test.c -o test -l cshare 如果当前链接⽬录下同时存在相同名称的共享库和静态库,⽐如libcshare.so、libcshare.a,在不加任何选项的情况下,编译器优先选择链接共享库,除⾮添加-static; -L (-L dir)添加链接时共享库搜索⽬录;gcc test.c -o test -lcshare -L/xx/xx -std= 选择适配的 C/C++ 标准版本,可选的有 c89/c90/c99/c11 等;C++有c++98/c++11/c++14等等;2.其他常⽤选项; -M 为 GNU make 输出显式依赖规则,包含标准库头⽂件及系统头⽂件; -MM 类似于 -M, 但是只会包含当前⼯程的头⽂件依赖; -MF file 把依赖结果写⼊到 file;gcc -M test.c -Ixxx/xxxgcc -MM test.c -Ixxx/xxxgcc -MM test.c -Ixxx/xxx -MF test.d 然后查看依赖⽂件:cat test.dtest.o: test.c xxx/xxx/test.h 此外还有其他常⽤的链接选项: -Wl,-Bsymbolic 优先使⽤本地符号, 防⽌链接当前共享库的应⽤程序中的符号覆盖当前共享库中同名的符号; -Wl,-soname,libtest.so.1 设置共享库的 SONAME 为 libtest.so.1,readelf -d libtest.so 可以查看共享库的 SONAME; -Wl,-rpath=/xxx/xxx 设置运⾏时共享库搜索⽬录; -Wl,-rpath=. 设置运⾏时的共享库搜索⽬录优先选择当前⽬录; -Wl,--version-script=test.map 控制共享库的导出符号,符号表的形式为:VER_1 { global: test1; test2; test3; local: *;};VER_2 { global: test4;} VER_1; #依赖于版本1 如果只需要控制符号表,可以写成如下形式:{ global: test1; test2; test3; local:*;}; -Wl,--retain-symbols-file=test.sym 控制静态库的导出符号,test.sym 的格式如下test1test2test3 创建共享库时,添加以上链接选项可以同时控制静态库导出符号和共享库导出符号,如下所⽰:gcc test1.o test2.o test3.o test4.o -o libtest.so -shared -Wl,--version-script=test.map,--retain-symbols-file=test.sym3.另⼀种控制符号导出的⽅式 -fvisibility=[default|internal|hidden|protected] 如果要公开你的接⼝或者 API,那么就需要将 __attribute__ ((visibility ("xxxxxx"))) 放在你需要公开的结构、类或者函数声明中,然后在编译选项中增加 -fvisibility=xxxx(可选的项有 default、internal、hidden 和 protected)。
gcc基本命令一、引言GCC是一款广泛使用的编译器,它可以将高级语言编写的程序转换成机器语言,从而使得计算机能够运行这些程序。
本文将介绍GCC 的基本命令,包括编译、链接等操作。
二、编译源代码编译是将源代码转换成目标文件的过程。
GCC提供了多种编译选项,可以用来指定编译的方式和参数。
下面是一些常用的编译命令及其说明:1. gcc -c source.c -o object.o该命令将源代码文件source.c编译成目标文件object.o。
选项“-c”表示只编译,不进行链接操作。
选项“-o”用于指定输出文件的名称。
2. gcc -E source.c -o preprocessed.c该命令将预处理源代码文件source.c输出到preprocessed.c文件中。
选项“-E”表示只进行预处理操作,不进行编译和链接。
3. gcc -S source.c -o assembly.s该命令将源代码文件source.c编译成汇编代码文件assembly.s。
选项“-S”表示只生成汇编代码,不进行后续的编译和链接。
三、链接目标文件链接是将多个目标文件合并成可执行文件的过程。
GCC提供了多种链接选项,用于指定链接的方式和参数。
下面是一些常用的链接命令及其说明:1. gcc object1.o object2.o -o executable该命令将目标文件object1.o和object2.o链接成可执行文件executable。
选项“-o”用于指定输出文件的名称。
2. gcc object1.o object2.o -o executable -lm该命令将目标文件object1.o和object2.o链接成可执行文件executable,并且链接了数学库libm。
选项“-lm”用于指定链接的数学库。
四、其他常用命令除了编译和链接命令外,GCC还提供了其他一些常用的命令,用于查看版本信息、优化编译结果等。
C语言编译器gcc命令如何操作步骤C语言是一种高级编程语言,由于其结构化编程,声明式语法,高效性和可靠性,被广泛用于很多领域。
gcc是一种C语言编译器,是Unix系统中最常用的编译器之一,它可以编译C、C++、JAVA等语言。
本文将为读者介绍对于gcc编译器的基本概念、相关命令以及实践操作步骤。
一、gcc基本概念1. 什么是编译器?先来了解一下编译器的作用。
编译器是将高级语言编写的程序转换成计算机可执行的机器语言的软件程序。
程序员可以使用高级语言编写程序,编译器将高级语言转换成计算机能够理解的机器语言。
2. 什么是gcc?GCC是GNU编译器集合(GNU Compiler Collection)的缩写。
它是一个重要的语言编译器,可以编译C、C++、JAVA等语言的程序。
gcc包含了一系列的编译器,每一个编译器都可以编译不同的语言,它不仅是Linux系统中的常用编译器,也被广泛使用于其他操作系统中。
3. gcc优点- 开源软件:可以透明、高效地利用计算机系统资源,让整个编译过程更灵活。
- 软件体积小:由于每次都是重新编译,因此gcc生成的二进制文件体积很小。
- 可移植性:gcc可以在不同的操作系统上进行编译。
同一份源代码,在不同的系统上编译,可以得到相同的结果。
- 动态链接库:gcc支持动态链接库,可以减少程序的代码冗余问题。
二、gcc常用命令以下是gcc编译器的常用命令:1. gcc -ogcc命令使用" -o"选项可以把源文件编译成可执行文件,例如:```$ gcc -o hello hello.c```上述命令的含义是将hello.c文件编译成hello可执行文件。
2. gcc -cgcc命令使用" -c"选项将源文件编译成目标文件。
目标文件是不可执行的文件,它包含了已经编译过的程序的一部分,这些程序可以用作最终的可执行文件中的一部分。
例如:```$ gcc -c hello.c```上述命令的含义是将hello.c文件编译成目标文件hello.o。
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 ,可以看到插进去了很多东西。
gcc 编译命令GCC计算机科学中的重要概念,它的全称是GNU Compiler Collection,它是一种免费的开源编译器,可以用于将高级语言编写的源代码编译成机器语言,进而可以在程序运行。
GCC经成为当今最广泛使用的编译器,因为它有许多优点:它可以帮助开发人员编写优秀的代码,还支持多种语言,其中包括C、C++、Objective-C、Java Fortran。
这里介绍一些常用的 GCC译命令。
首先,最基本的是 gcc令,这一命令能够帮助用户编译源代码文件,并输出可执行文件。
例如,如果要编译 hello.c,可以使用以下命令:gcc hello.c -o hello此外,还有一个函数:gcc -c,它可以将源文件编译成目标文件(.o文件),而不创建可执行文件。
此外,GCC提供了一些其他的命令,可以用来优化源代码的编译效率,以及检查可执行文件的潜在错误,这些命令包括:1. gcc -Wall项:这个选项可以显示编译器产生的所有警告信息,帮助开发人员快速发现程序中的问题。
2. gcc -O项:设置优化等级,可以提高可执行文件的执行效率。
3. gcc -W项:这个选项可以检查程序中的错误,并输出可用来调试程序的相关信息。
4. gcc -S项:这个选项可以将编译好的汇编语言代码保存为文件,这有助于开发人员仔细检查所有程序文件。
以上就是 GCC译命令的基本信息。
它们一般通常在编写高级语言代码时使用,使开发人员可以将其编译为机器语言,便于程序的执行。
GCC译命令的优点之一是它们支持多种语言,这样可以让开发人员使用多种编程语言进行开发,同时还提供了一些有助于检查程序正确性的功能。
另外,GCC提供了优化等级和警告信息显示的功能,从而可以提高程序的执行效率,并减少出现错误的概率。
因此,GCC译命令不仅支持多种语言,而且具备许多实用的特性,可以为程序开发者带来更大的便利性和效率。
未来,GCC译命令将会有更多的发展,以满足开发者更高的要求。
gcc编译过程的四个阶段命令嘿,朋友们!今天咱就来唠唠 gcc 编译过程的四个阶段和那些相关的命令。
你知道吗,gcc 编译就像是一场奇妙的旅程。
首先呢,是预处理阶段,这就好比是给原材料进行初步的加工和整理。
在这个阶段,那些宏定义啊、头文件包含啊啥的都被处理好了。
就好像做饭前要把食材都准备好一样。
然后就是编译阶段啦,这时候代码就开始被翻译成机器能懂的语言啦,就跟咱学外语似的,得把咱说的话翻译成别的语言人家才能懂嘛。
接着呢,是汇编阶段,这就像是把翻译好的东西再进一步整理、组合,变成更有条理的形式。
最后就是链接阶段啦,这可是把各个部分都连接起来,形成一个完整的可执行文件,就像搭积木一样,把一块块小积木搭建成一个漂亮的大城堡。
那这每个阶段都有哪些命令呢?预处理阶段常用的命令就是 gcc -E 啦,它能让你看到预处理后的结果哦,是不是很神奇?编译阶段呢,就是 gcc -S 啦,它能生成汇编代码呢。
汇编阶段就用 gcc -c 呀,能得到目标文件。
而链接阶段呢,那就是 gcc 啦,直接生成可执行文件。
你想想看,要是没有这些命令,gcc 编译过程不就像没头苍蝇一样乱撞啦?这就好比你要去一个地方,没有地图和导航,那不得迷路呀!而且啊,理解了这些阶段和命令,你就能更好地掌控整个编译过程啦。
就像你掌握了一门绝世武功的秘籍一样,是不是感觉自己瞬间厉害了起来?比如说,你在写代码的时候遇到了一些奇怪的问题,这时候你要是了解gcc 编译过程,就能通过查看不同阶段的输出,找到问题所在呀。
这就跟医生看病似的,得先做各种检查,才能知道病因在哪儿,然后对症下药嘛。
所以啊,朋友们,可别小瞧了这gcc 编译过程的四个阶段和命令哦。
它们就像是你的得力助手,能帮你写出更棒的代码,让你的程序跑得更顺畅。
反正我觉得啊,这 gcc 编译过程真的很有意思,也很重要。
你要是还没搞懂,那就赶紧去研究研究吧,相信你一定会有新的收获和惊喜的!咋样,还不赶紧行动起来?。
GCC 命令行详解
文章出处:blog 作者:发布时间:2006-11-02
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去掉就是库名了。
好了现在我们知道怎么得到库名了,比如我们自已要用到一个第三方提供的库名字叫lib test.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/bb b/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
-lgmodule -lglib -ldl -lXi -lXext -lX11 -lm",这就是编译一个gtk1.2程序所需的g tk链接参数,xxx-config除了--libs参数外还有一个参
数是--cflags用来生成头文
件包含目录的,也就是-I参数,在下面我们将会讲到。
你可以试试执行gtk-config
--libs --cflags,看看输出结果。
现在的问题就是怎样用这些输出结果了,最笨的方法就是复制粘贴或者照抄,聪明的办
法是在编译命令行里加入这个`xxxx-config --libs --
cflags`,比如编译一个gtk程序:gcc gtktest.c `gtk-config --libs --cflags`这样
就差
不多了。
注意`不是单引号,而是1键左边那个键。
除了xxx-config以外,现在新的开发包一般都用pkg-config来生成链接参数,使用方法
跟xxx-config类似,但xxx-config是针对特定的开发包
,但pkg-config包含很多开发包的链接参数的生成,用pkg-config --list-all命令可以列出所支持的所有开发包,pkg-config的用法就是pkg
-config pagName --libs --cflags,其中pagName是包名,是pkg-config--list-all里
列出名单中的一个,比如gtk1.2的名字就是gtk+,pkg-
config gtk+ --libs --cflags的作用跟gtk-config --libs --cflags是一样的。
比如:gcc gtktest.c `pkg-config gtk+ --libs --cflags`。
5。
-include和-I参数
-include用来包含头文件,但一般情况下包含头文件都在源码里用#include xxxxxx实现
,-include参数很少用。
-I参数是用来指定头文件目录
,/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/i nclude里我们就要用-I参数指定了,比如头文件放
在/myinclude目录里,那编译命令行就要加上-I/myinclude参数了,如果不加你会得到
一个"xxxx.h: No such file or directory"的错误。
-I
参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。
上面我们提到的--cf lags参数就是用来生成-I参数的。
6。
-O参数
这是一个程序优化参数,一般用-O2就是,用来优化程序用的,比如gcc test.c -O2,优化得到的程序比没优化的要小,执行速度可能也有所提
高(我没有测试过)。
7。
-shared参数
编译动态库时要用到,比如gcc -shared test.c -o libtest.so
8。
几个相关的环境变量
PKG_CONFIG_PATH:用来指定pkg-config用到的pc文件的路径,默认是/usr/lib/pkgconf ig,pc文件是文本文件,扩展名是.pc,里面定义开发
包的安装路径,Libs参数和Cflags参数等等。
CC:用来指定c编译器。
CXX:用来指定cxx编译器。
LIBS:跟上面的--libs作用差不多。
CFLAGS:跟上面的--cflags作用差不多。
CC,CXX,LIBS,CFLAGS手动编译时一般用不上,在做configure时有时用到,一般情况
下不用管。
环境变量设定方法:export ENV_NAME=xxxxxxxxxxxxxxxxx
9。
关于交叉编译
交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上,比
如在我们地PC平台(X86 CPU)上编译出能运行在sparc
CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到sparc CPU平台上才能运行。
当然两个平台用的都是linux。
这种方法在异平台移植和嵌入式开发时用得非常普遍。
相对与交叉编译,我们平常做的编译就叫本地编译,也就是在当前平台编译,编译得到
的程序也是在本地执行。
用来编译这种程序的编译器就叫交叉编译器,相对来说,用来做本地编译的就叫本地编
译器,一般用的都是gcc,但这种gcc跟本地的gcc编译器
是不一样的,需要在编译gcc时用特定的configure参数才能得到支持交叉编译的gcc。
为了不跟本地编译器混淆,交叉编译器的名字一般都有前缀,比如sparc-xxxx-linux-gn
u-gcc,sparc-xxxx-linux-gnu-g++ 等等
10。
交叉编译器的使用方法
使用方法跟本地的gcc差不多,但有一点特殊的是:必须用-L和-I参数指定编译器用spar c系统的库和头文件,不能用本地(X86)
的库(头文件有时可以用本地的)。
例子:
sparc-xxxx-linux-gnu-gcc test.c -L/path/to/sparcLib -I/path/to/sparcInclude。