gcc常用指令及相关知识

摘要:
1.gcc和g++之间的问题:1.如果后缀是.c,gcc将其视为c程序,g++视为c++程序;后缀为Cpp,两者都将被视为c++程序。默认情况下,GCC不会生成任何警告消息。编写C或C++程序以检测程序问题时,编译器警告非常有用。

1,gcc与g++的问题:

1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序。

2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接。

当我们常规使用gcc编译一个程序时,他通常执行4个步骤:预编译,编译,汇编,连接.

当然我们可以通过指定某个选项来使它停止在某个步骤上.

指定GCC进行的操作的选项

-E :让GCC仅进行预处理;得到 .i 文件;

-S :让GCC仅进行预处理,编译;得到 .s 文件;

-c :让GCC仅进行预处理,编译,汇编;得到 .o 文件;

-o Ouput:指定输出文件,让GCC仅进行预处理,编译,汇编,连接;得到 可执行文件(默认为a.out);

控制输出信息

-w:禁止输出所有警告信息

-Wall:输出所有警告信息

-Werror:将所有警告信息当成错误信息输出。

调试相关选项(生成调试信息)

-g:生成用于GDB调试程序使用的调试信息

-p:生成用于prof程序使用的调试信息

-pg:生成用于gprof程序使用的调试信息

程序优化选项

-O,-O1:初步优化(会占用更多时间进行编译,但是编译后的程序运行时占用的内存更少)

-O2:比-O1更进一步优化

-O3:比-O2更进一步优化

-O0:不进行优化

宏操作

-D name:定义宏name的值为1,类似在源程序中使用#define name 1

-D name=val:定义宏name的值为val,类似#define name val

-U name:取消宏name的定义,类似#undef name

-undef:取消所有系统指定或GCC指定的宏定义,但保留标准预定义的宏

指定搜索目录

-I dir,-Idir:追加目录dir到头文件的搜索路径中

-L dir,-Ldir:追加目录dir到库文件的搜索路径中

-Bprefix:指定gcc查找库文件,头文件,数据文件的目录

指定使用的库文件,头文件

-nostdinc:不使用标准头文件(默认在/usr/include)

-nostdlib:不使用标准库文件(默认在/usr/lib)

-l library:指定使用的库文件,默认gcc在编译一个程序时只连接到标准c库 上,是用该选项能够使他连接到指定的库上,例如若你要连接到数学库上(libm.a)则你只须指定 -lm就可以了。也就是说这个选项指定连接的库文件可以将前缀lib和后缀.a(或.so)省略。

-nostartfiles:不使用标准的系统的startup文件

指定连接库文件的方式

-shared:动态连接到库文件上,这是默认行为。

-static:静态连接到库文件上

注:动态连接和静态连接的区别在于:动态连接是在程序运行时才连接到库文件上(也就是需要用到时才连接上),而静态连接则是在编译时就将程序连接到库文件中(这样做会增大程序,但便于移植)

备注:

选项 -Wall 开启编译器几乎所有常用的警告──强烈建议你始终使用该选项。编译器有很多其他的警告选项,但 -Wall 是最常用的。默认情况下GCC 不会产生任何警告信息。当编写 C 或 C++ 程序时编译器警告非常有助于检测程序存在的问题。

参考:

http://blog.chinaunix.net/uid-27040051-id-3444056.html

http://www.ha97.com/2884.html

免责声明:文章转载自《gcc常用指令及相关知识》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySQL、MongoDB、Redis 数据库之间的区别vs的多工程配置概述(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux编程头文件所在路径的问题

一、问题引入 1、头文件与库       当我们在PC主机linux环境下(如ubuntu),编写linux应用程序,然后利用gcc来编译。在源代码的开始位置会写入头文件,那是因为我们使用了系统提供的库函数,例如printf、open、read、write等等。我们会写入类似的内容: #include <stdio.h> #include &...

字节对齐《c和指针》笔记包含位域结构体的内存对齐(32bit,GCC)

最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--字节对齐     C99划定int、unsigned   int和bool可以作为位域类型。但编译器几乎都对此作了扩展,答应其它类型类型的存在。     如果结构体中含有位域(bit-field),总结规则如下:(以下代码在x86 32bit系统上测试,gcc 4.1.2)     1) 如果...

安装arm-linux-gcc编译器时出现错误,请大神看看怎么回事

echo '/opt/buildroot-2011.05/output/toolchain/gcc-4.3.5/gcc/ada/decl.c' >> tmp-gi.listecho '/opt/buildroot-2011.05/output/toolchain/gcc-4.3.5/gcc/ada/trans.c' >> tmp-g...

转载 ldd3环境配置

ldd3(《linux设备驱动程序》)里面使用的正是Linux2.6.10内核,如果内核不同,使用课本里的代码会出现各种问题,所以搭建与课本一样内核版本的环境,用来学习。 尝试过使用ubuntu14.04、fedora21直接编译2.6.10内核,结果都是gcc版本太高,尝试过给gcc降级,各种失败。 尝试在ubuntu9.04 ,10.04编译他们各自...

曹工说Redis源码(1)-- redis debug环境搭建,使用clion,达到和调试java一样的效果

概要 最近写了spring系列,这个系列还在进行中,然后有些同学开始叫我大神,然后以为我各方面都比较厉害,当然了,我是有自知之明的,大佬大神什么的,当作一个称呼就好,如果真的以为自己就是大神,那可能就走偏了。 其实我不少方面都比较薄弱,比如redis、mysql、jvm这些c语言写的东西,很多书,我也看过多次,看的那段时间,你可能懂了,也可以在面试的时候,...

卡常头文件

#pragma GCC optimize("Ofast") #pragma GCC target("sse3","sse2","sse") //#pragma GCC target("avx","sse4","sse4.1","sse4.2","ssse3") //#pragma GCC target("f16c") //#pragma GCC targe...