linuxgccg++编译命令选项gcc/g++在执⾏编译⼯作的时候,总共需要4步
1.预处理,⽣成.i的⽂件[预处理器cpp]
2.将预处理后的⽂件不转换成汇编语⾔,⽣成⽂件.s[编译器egcs]
3.有汇编变为⽬标代码(机器代码)⽣成.o的⽂件[汇编器as]
4.连接⽬标代码,⽣成可执⾏程序[链接器ld]
[参数详解]
-c
只激活预处理,编译,和汇编,也就是他只把程序做成obj⽂件
例⼦⽤法:
gcc -c hello.c
他将⽣成.o的obj⽂件
-
S
只激活预处理和编译,就是指把⽂件编译成为汇编代码。
例⼦⽤法
gcc -S hello.c
他将⽣成.s的汇编代码,你可以⽤⽂本编辑器察看
-E
只激活预处理,这个不⽣成⽂件,你需要把它重定向到⼀个输出⽂件⾥
⾯.
例⼦⽤法:
gcc -E hello.c >
gcc -E hello.c | more
慢慢看吧,⼀个hello word 也要与处理成800⾏的代码
-o
制定⽬标名称,缺省的时候,gcc 编译出来的⽂件是a.out,很难听,如果
你和我有同感,改掉它,哈哈
例⼦⽤法
gcc - hello.c (哦,windows⽤习惯了)
-pipe
使⽤管道代替编译中临时⽂件,在使⽤⾮gnu汇编⼯具的时候,可能有些问
题
gcc -pipe - hello.c
-ansi
关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁⽌⼀
些asm inline typeof关键字,以及UNIX,vax等预处理宏,
-fno-asm
此选项实现ansi选项的功能的⼀部分,它禁⽌将asm,inline和typeof⽤作
关键字。
-fno-strict-prototype
只对g++起作⽤,使⽤这个选项,g++将对不带参数的函数,都认为是没有显式
的对参数的个数和类型说明,⽽不是没有参数.
⽽gcc⽆论是否使⽤这个参数,都将对没有带参数的函数,认为城没有显式说
明的类型
-fthis-is-varialble
就是向传统c++看齐,可以使⽤this当⼀般变量使⽤.
-fcond-mismatch
允许条件表达式的第⼆和第三参数类型不匹配,表达式的值将为void类型
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
这四个参数是对char类型进⾏设置,决定将char类型设置成unsigned char(前 两个参数)或者 signed char(后两个参数)
-include file
包含某个代码,简单来说,就是便以某个⽂件,需要另⼀个⽂件的时候,就可以
⽤它设定,功能就相当于在代码中使⽤#include<filename>
例⼦⽤法:
gcc hello.c -include /root/pianopan.h
-imacros file
将file⽂件的宏,扩展到gcc/g++的输⼊⽂件,宏定义本⾝并不出现在输⼊⽂件 中
-Dmacro
相当于C语⾔中的#define macro
-Dmacro=defn
相当于C语⾔中的#define macr
三个⽂件,⼀个头⽂件,两个程序⽂件
/*
d.h
*/
#include <iostream>
using namespace std;
class Dataset
{
public:
int getdata();
};
/*
d.cpp
*/
#include "d.h"
int Dataset::getdata()
{
return1231;
}
/*
out.cpp
*/
#include <iostream>
#include "d.h"
using namespace std;
int main()
{
Dataset Ds;
cout<&data()<<endl;
return1;
}
编译:
[root@localhost code]# g++ -o test.o d.cpp out.cpp
[root@localhost code]# ./test.o
1231
[root@localhost code]#
编译成动态库
[root@localhost code]# g++ -o d.o -c d.cpp
[root@localhost code]# ar -r d.a d.o
ar: 正在创建 d.a
[root@localhost code]# g++ -o out out.cpp ./d.a
linux下gcc编译的四个步骤[root@localhost code]# ./out
1231
[root@localhost code]#
o=defn
-Umacro
相当于C语⾔中的#undef macro
-
undef
取消对任何⾮标准宏的定义
-Idir
在你是⽤#include"file"的时候,gcc/g++会先在当前⽬录查你所制定的头
⽂件,如果没有到,他回到缺省的头⽂件⽬录,如果使⽤-I制定了⽬录,他
回先在你所制定的⽬录查,然后再按常规的顺序去.
对于#include<file>,gcc/g++会到-I制定的⽬录查,查不到,然后将到系
统的缺省的头⽂件⽬录查
-I-
就是取消前⼀个参数的功能,所以⼀般在-Idir之后使⽤
-idirafter dir
在-I的⽬录⾥⾯查失败,讲到这个⽬录⾥⾯查.
-iprefix prefix
-iwithprefix dir
⼀般⼀起使⽤,当-I的⽬录查失败,会到prefix+dir下查
-nostdinc
使编译器不再系统缺省的头⽂件⽬录⾥⾯头⽂件,⼀般和-I联合使⽤,明确
限定头⽂件的位置
-nostdin C++
规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创建
libg++库使⽤
-C
在预处理的时候,不删除注释信息,⼀般和-E使⽤,有时候分析程序,⽤这个很
⽅便的
-M
⽣成⽂件关联的信息。包含⽬标⽂件所依赖的所有源代码
你可以⽤gcc -M hello.c来测试⼀下,很简单。
-MM
和上⾯的那个⼀样,但是它将忽略由#include<file>造成的依赖关系。
-MD
和-M相同,但是输出将导⼊到.d的⽂件⾥⾯
-MMD
和-MM相同,但是输出将导⼊到.d的⽂件⾥⾯
-
Wa,option
此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选 项,然后传递给会汇编程序
-Wl.option
此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选 项,然后传递给会连接程序.
-llibrary
制定编译的时候使⽤的库
例⼦⽤法
gcc -lcurses hello.c
使⽤ncurses库编译程序
-Ldir
制定编译的时候,搜索库的路径。⽐如你⾃⼰的库,可以⽤它制定⽬录,不然
编译器将只在标准库的⽬录。这个dir就是⽬录的名称。
-O0
-O1
-O2
-O3
编译器的优化选项的4个级别,-O0表⽰没有优化,-O1为缺省值,-O3优化级别最
⾼
-g
只是编译器,在编译的时候,产⽣调试信息。
-gstabs
此选项以stabs格式声称调试信息,但是不包括gdb调试信息.
-gstabs+
此选项以stabs格式声称调试信息,并且包含仅供gdb使⽤的额外调试信息.
-ggdb
此选项将尽可能的⽣成gdb的可以使⽤的调试信息.
-static
此选项将禁⽌使⽤动态库,所以,编译出来的东西,⼀般都很⼤,也不需要什么
动态连接库,就可以运⾏.
-share
此选项将尽量使⽤动态库,所以⽣成⽂件⽐较⼩,但是需要系统由动态库.
-traditional
试图让编译器⽀持传统的C语⾔特性
g++ 编译和链接
传统意义上的编译程序分两步⾛ —— 编译和链接:
1.编译(compile):指⽤编译器(compiler)将源代码(source code)⽣成⼆进制⽬标⽂件(object file),在Windows下也就是 .obj ⽂件,UNIX下是 .o ⽂件。编译时,编译器需要的是语法的正确,函数与变量的声明的正确,编译器只检测程序语法,和函数、变量是否被声明,函数并不需要被定义。
UNIX下g++的语法为:
g++ -c file.cpp
-c 是compile的意思,此命令将会⽣成 file.o 的⽬标⽂件。
2.链接(link):到所要⽤到函数所在的⽬标⽂件,并把它们链接在⼀起合成为可执⾏⽂件(executable file)。链接时,要确保编译器能到所有被⽤到了的函数所在的⽬标⽂件。
g++ file1.o file2.o -
-
o 是指定⽣成的可执⾏⽂件名称(output)。若不给出,默认的名称为 a.out
上述两部通常也可以合在⼀起完成:
g++ file1.cpp file2.cpp -
这完全等同于上⾯两步的结合,会先⽣成⽬标⽂件,然后链接成
3. 库 (library)
对于⼀个源⽂件很多的⼤项⽬,为了避免重复编译,也为了⽅便编译器链接,通常会把⼀些常⽤ 到的⽬标⽂件打包(archive),于是就成为了传说中的库⽂件(library)。在Windows下这种包叫“库⽂件”(Library File),也就是 .lib ⽂件,在UNIX下,是Archive File,也就是 .a ⽂件。
UNIX 所要⽤到的命令:
1)ar -- create, modify, and extract from archives.
@Usage: ar cr lib****.a file1.o file2.o
**** 为⾃定义的库⽂件名。
标签 c (create):如果库不存在,则创建库;
标签 r (replace):如果库中已存在要添加的对象⽂件,则旧的对象⽂件将被替换。
实际上 ar 只是⼀个打包⼯具,是archive(打包)的⾸字母。它将⼀系列的⽬标⽂件⾸位连接在⼀起,并内嵌⼀个索引表,使得编译器能够⽅便地到所需要的函数。 ⼀般来说,由于函数索引表的存在,对库的链接要⽐对⼀般的对象⽂件的链接更快。如果 ar 未能完成此项索引表⼯作,还可以⼿动⽤以下的 ranlib 命令创建索引表。
2) ranlib -- generate index to archive.
@Usage: ranlib lib****.a
3) nm -- list symbols from object files.
nm可以⽤来显⽰ ranlib 所构建的索引表。你将会看到所有库⾥的函数名(除了模板函数template function)。
4. 在编译时链接库
创建了⾃⼰的库,以后要⽤到相关函数的时候,只需在代码中声明所要⽤的函数(必须和库中定义得相同)。在链接的时候,需要给出库的名称和位置:
g++ file1.o file2.o - -L**** -l****
-L 后紧跟库⽂件所在的⽬录地址,-l 后紧跟库名。
编译器在链接的时候会在所指定的⽬录地址下寻名为 lib****.a 的库⽂件。
三个⽂件,⼀个头⽂件,两个程序⽂件
/*
d.h
*/
#include <iostream>
using namespace std;
class Dataset
{
public:
int getdata();
};
/*
d.cpp
*/
#include "d.h"
int Dataset::getdata()
{
return1231;
}
/*
out.cpp
*/
#include <iostream>
#include "d.h"
using namespace std;
int main()
{
Dataset Ds;
cout<&data()<<endl;
return1;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论