当前位置: 首页 > 编程日记 > 正文

gcc使用总结

1.基本选项

-o 指定输出文件名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。

# cc  -o XX XX.c


-c
编译、汇编到目标代码,不进行链接

-v
打印较多信息,显示编译器调用的程序。

-E
仅作预处理,不进行编译、汇编和链接。

-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.例子用法:gcc -E hello.c > pianoapan.txtgcc -E hello.c | more慢慢看吧,一个hello word 也要与处理成800行的代码 

-E选项,表示让gcc只进行“预处理”就行了。 所谓的预处理,就是把程序中的宏展开, 把头文件的内容展开包含进来等等一些编译前的预处理操作。预处理结果会显示到屏幕上,如果需要保存,则得需要重定向


-m32
-m64
生成32位/64位机器上的代码。


2.gcc选项--调试

-g,生成调试信息。

# cc -g -o XX XX.c

-ggdb
-ggdblevel
为调试器 gdb 生成调试信息。level 可以为1,2,3,默认值为2。

-g
-glevel
生成操作系统本地格式的调试信息。-g 和 -ggdb 并不太相同, -g 会生成 gdb 之外的信息。level 取值同上。


3.gcc选项--汇编

-S 仅编译到汇编语言,不进行汇编和链接。

# cc -S XX.c


4.gcc优化

-O0
禁止编译器进行优化。默认为此项。

-O
-O1
尝试优化编译时间和可执行文件大小。

-O2
更多的优化,会尝试几乎全部的优化功能,但不会进行“空间换时间”的优化方法。

-O3
在 -O2 的基础上再打开一些优化选项:-finline-functions, -funswitch-loops 和 -fgcse-after-reload 。

-Os
对生成文件大小进行优化。它会打开 -O2 开的全部选项,除了会那些增加文件大小的。


-finline-functions
把所有简单的函数内联进调用者。编译器会探索式地决定哪些函数足够简单,值得做这种内联。

-fstrict-aliasing
施加最强的别名规则(aliasing rules)。


# cc -o XX XX.c


5.gcc选项-Wall

-W是打开警告选项
-all打开所有

# cc -g -Wall -o XX XX.c

-Wall
会打开一些很有用的警告选项,建议编译时加此选项。

-W
-Wextra
打印一些额外的警告信息。

-w
禁止显示所有警告信息。

-Wshadow
当一个局部变量遮盖住了另一个局部变量,或者全局变量时,给出警告。很有用的选项,建议打开。 -Wall 并不会打开此项。

-Wpointer-arith
对函数指针或者void *类型的指针进行算术操作时给出警告。也很有用。 -Wall 并不会打开此项。

-Wcast-qual
当强制转化丢掉了类型修饰符时给出警告。 -Wall 并不会打开此项。

-Waggregate-return
如果定义或调用了返回结构体或联合体的函数,编译器就发出警告。

-Winline
无论是声明为 inline 或者是指定了-finline-functions 选项,如果某函数不能内联,编译器都将发出警告。如果你的代码含有很多 inline 函数的话,这是很有用的选项。

-Werror
把警告当作错误。出现任何警告就放弃编译。

-Wunreachable-code
如果编译器探测到永远不会执行到的代码,就给出警告。也是比较有用的选项。

-Wcast-align
一旦某个指针类型强制转换导致目标所需的地址对齐增加时,编译器就发出警告。

-Wundef
当一个没有定义的符号出现在 #if 中时,给出警告。

-Wredundant-decls
如果在同一个可见域内某定义多次声明,编译器就发出警告,即使这些重复声明有效并且毫无差别。


6.多个程序文件的编译

  通常整个程序是由多个源文件组成的,相应地也就形成了多个编译单元,使用GCC能够很好地管理这些编译单元。假设有一个由test1.c和 test2.c两个源文件组成的程序,为了对它们进行编译,并最终生成可执行程序test,可以使用下面这条命令:
# cc test1.c test2.c -o test

  如果同时处理的文件不止一个,GCC仍然会按照预处理、编译和链接的过程依次进行。如果深究起来,上面这条命令大致相当于依次执行如下三条命令:
# cc -c test1.c -o test1.o
# cc -c test2.c -o test2.o
# cc test1.o test2.o -o test


7.gcc链接外部库--I和L选项

-l library (仅对标准库)
进行链接时搜索名为library的库, -lm相当于libm.a。
例子: $ gcc test.c -lm -o test

-Idir
dir 加入到搜索头文件的路径列表中。
例子: $ gcc test.c -I../inc -o test

-Ldir
dir 加入到搜索库文件的路径列表中。
例子: $ gcc -I/home/foo -L/home/foo -ltest test.c -o test

8.线程库

由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数:

# gcc thread1.c -o thread1 -lpthread

9.gcc选项--fpic

-fpic:产生位置无关码

解释一下,位置无关码就是可以在进程的任意内存位置执行的目标码,动态链接库必须使用。

如果使用Makefile构建,一般要给CFLAGS中指定CFLAGS=-fPIC


10.gcc选项--共享

-shared

  生成共享目标文件。通常用在建立共享库时。

-static

  禁止使用共享连接。


11.使用Makefile构建

一般要给CFLAGS中指定-g

CFLAGS= -Wall -o2 -g

如果用configure脚本生成Makefile

#./configure CFLAGS= "-Wall -02 -g"

调试

#./configure CFLAGS= "-0 -g"


12.查看gcc版本

查看glibc版本

# rpm -qa | grep glibc

glibc-2.12-1.80.el6_3.6.x86_64
glibc-headers-2.12-1.80.el6_3.6.x86_64
glibc-devel-2.12-1.80.el6_3.6.x86_64
glibc-common-2.12-1.80.el6_3.6.x86_64

 
或者# ldd  --version

ldd (GNU libc) 2.12

 
查看gcc版本

# rpm -qa | grep gcc

gcc-gfortran-4.4.6-4.el6.x86_64
gcc-4.4.6-4.el6.x86_64
gcc-c++-4.4.6-4.el6.x86_64
libgcc-4.4.6-4.el6.x86_64
gcc-java-4.4.6-4.el6.x86_64


或者# gcc -v

使用内建 specs。
目标:x86_64-redhat-linux
配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
线程模型:posix
gcc 版本 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)


# man gcc

GCC编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到


GCC设定include和库路径

一、头文件

gcc 在编译时寻找所需要的头文件 :

※搜寻会从-I开始

※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH (这些变量在windows下对应的是include环境变量)

※再找内定目录

/usr/include

/usr/local/include

/usr/lib/gcc-lib/i386-linux/2.95.2/include

/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3

/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include

库文件但是如果装gcc的时候,是有给定的prefix的话,那么就是

/usr/include

prefix/include

prefix/xxx-xxx-xxx-gnulibc/include

prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

二、库文件

编译的时候:

※gcc会去找-L

※再找gcc的环境变量LIBRARY_PATH

※再找内定目录 /lib:/usr/lib: /usr/local/lib:这是当初compile gcc时写在程序内的

三、运行时动态库的搜索路径

1、在配置文件/etc/ld.so.conf中指定动态库搜索路径

2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)(HP- UX对应的是SHLIB_PATH环境变量,AIX对应的是LIBPATH环境变量,windows对应的是lib环境变量)

3、在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目标代码时指定程序的动态库搜索路径。

这是通过gcc 的参数"-Wl,-rpath,"指定。当指定多个动态库搜索路径时,路径之间用冒号":"分隔

4、默认的动态库搜索路径/lib    /usr/lib

可以通过执行可执行文件pos得到的结果不同获知其搜索到了哪个动态库,从而获得第1个动态库搜索顺序,然后删除该动态库,

再执行程序pos,获得第2个动态库搜索路径,再删除第2个被搜索到的动态库,

如此往复,将可得到Linux搜索动态库的先后顺序。

程序pos执行的输出结果和搜索到的动态库的对应关系如表1所示

程序pos输出结果 使用的动态库 对应的动态库搜索路径指定方式

./ ./libpos.so 编译目标代码时指定的动态库搜索路径

/root/test/env/lib /root/test/env/lib/libpos.so 环境变量LD_LIBRARY_PATH指定的动态库搜索路径

/root/test/conf/lib /root/test/conf/lib/libpos.so 配置文件/etc/ld.so.conf中指定的动态库搜索路径

/lib /lib/libpos.so 默认的动态库搜索路径/lib

/usr/lib /usr/lib/libpos.so 默认的动态库搜索路径/usr/lib

动态库的搜索路径搜索的先后顺序是:

1.编译目标代码时指定的动态库搜索路径;

2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

4.默认的动态库搜索路径/lib    /usr/lib。

// using –Wl,--rpath

#gcc main.c -ldl  -Wl,—rpath=/home/username/usr/lib

相关文章:

websecurity - Web Security Testing Framework 超级牛B扫描器

Windows – Websecurify 0.3.exehttp://websecurify.googlecode.com/files/Websecurify%200.3.exeLinux – Websecurify 0.3.tgzhttp://websecurify.googlecode.com/files/Websecurify%200.3.tgzMac – Websecurify 0.3.dmghttp://websecurify.googlecode.com/files/Websecurif…

C中的qsort函数和C++中的sort函数的理解与使用

一、qsort()函数 原型:_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*)); 参数解释:1、待排序数组首地址;2、数组中待排序元素数量;3、各元素的占用空间的大小;4、指向函数的指…

机器学习新闻综述:2019年AI领域不得不看的6篇文章

作者 | Limarc Ambalina翻译 | 火火酱,编辑 | Carol出品 | AI科技大本营(ID:rgznai100)在这篇机器学习新闻综述中,我们将回顾一些2019年以来在人工智能各个领域广泛传播或产生影响的重大新闻。此外,我们还将…

GDB attach到进程

要调试守护进程等已经启动的进程或是调试陷于死循环的进程可以使用attach命令 格式 attach pid C语言代码 #include <stdio.h> int main(void) { int marks[10]; int i; for(i0;i<12;i) { scanf("%d",&marks[i]); …

Chrome使用技巧和编辑框拖动怪问题。

常用快捷键&#xff1a;ctrlshiftt 重新打开刚关闭的网页ctrlh 打开历史记录ctrl 放大。ShiftEscape 查看任务管理器据说Chrome能调整编辑区大小&#xff0c;我没发现。倒发现Chrome一个问题&#xff0c;选中编辑框中的文字&#xff0c;一直拖动鼠标&a…

Linux中断研究

2019独角兽企业重金招聘Python工程师标准>>> 研究linux系统&#xff0c;不管是做驱动、协议栈还是进程调度等等&#xff0c;都离不开中断。这说明&#xff0c;要想编写正确的linux代码&#xff0c;不了解中断是不行的。 话说曾几何时&#xff0c;在大学的课堂里&…

linux环境内存分配原理

Linux的虚拟内存管理有几个关键概念&#xff1a; Linux 虚拟地址空间如何分布&#xff1f;malloc和free是如何分配和释放内存&#xff1f;如何查看堆内内存的碎片情况&#xff1f;既然堆内内存brk和sbrk不能直接释放&#xff0c;为什么不全部使用 mmap 来分配&#xff0c;munm…

大脑芯片公司Neuralink计划在人脑内植入芯片,他们到底想干什么?

作者 | James Murphy翻译 | 火火酱&#xff0c;编辑 | Carol出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;说实话&#xff0c;科幻电影在遇到Neuralink时也不得不甘拜下风。2019年7月&#xff0c;埃隆马斯克(Elon Musk)宣布&#xff0c;他的公司正在研发…

判断链表是否存在环(及其延伸)

有一个单链表&#xff0c;其中可能有一个环&#xff0c;也就是某个节点的next指向的是链表中在它之前的节点&#xff0c;这样在链表的尾部形成一环。问题&#xff1a;1、如何判断一个链表是不是这类链表&#xff1f;2、如果链表为存在环&#xff0c;如果找到环的入口点&#xf…

iOS跳转到各种系统设置界面

定位服务 定位服务有很多APP都有&#xff0c;如果用户关闭了定位&#xff0c;那么&#xff0c;我们在APP里面可以提示用户打开定位服务。点击到设置界面设置&#xff0c;直接跳到定位服务设置界面。代码如下&#xff1a; //定位服务设置界面 NSURL *url [NSURL URLWithString:…

Linux内存管理大图(第三稿)

网友画的还不错就转了 &#xff0c;该作者一共画了3版 v0.1 v0.2 v0.3 原文地址&#xff1a;http://bbs.chinaunix.net/thread-2018659-1-1.html

VNC的安装与使用

VNC的安装与使用。 说明&#xff1a;文章内容比较简单&#xff0c;献给那些初学者作为参考。 文章分为两部分&#xff0c;第一部分为VNC简介&#xff0c;第二部分为VNC的安装与使用。 文章为小弟结合书籍与小弟的实际操作总结出来的&#xff0c;如有错误与疏漏之处…

百度「AI战疫」:首次开源肺炎CT影像分析AI模型,让诊断从分钟到秒

自疫情爆发以来&#xff0c;多家科技公司纷纷加入了抗击疫情的战役中。 其中&#xff0c;排查疫情是这场战役的重中之重&#xff0c;而 CT 影像已成为新冠肺炎筛查和病情诊疗的重要依据。 然而&#xff0c;在当前疫情诊疗的关键时期&#xff0c;存量患者和新增患者总体数量庞…

Linux_DNS服务器

目录 目录DNS DNS ServerServerSite Master DNS ServerForward DomainReverse Resolution Slave DNS ServerForward lookupReverse lookupSplit DNS ServerDNS DNS(Domain Name System&#xff0c;域名系统)&#xff0c;在Internet上作为域名和IP地址映射的一个分布式数据库&am…

多场景下的AI疫情防控“天网”:解读云边端联动下的全栈AI技术

在全民抗疫的特殊时期下&#xff0c;伴随着春运返潮&#xff0c;企业陆续复工&#xff0c;从重点防控的机场、火车站等场所&#xff0c;到学校、企业、社区等密集型场所&#xff0c;都是不能忽视的地点。除了人工逐一测量体温排查外&#xff0c;我们还发现&#xff0c;在人员复…

DHCP配置与DHCP中继代理2

实验二&#xff1a;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />Step1、配置DHCP中继代理1) 打开“管理工具”→“路由和远程访问”窗口&#xff0c;启用路由和远程访问&#xff0c;按向导提示完成操作。<?xml:namespac…

查看CPU是i386架构和x86_64架构

查看处理器是32位还是64位 #cat /proc/cpuinfo 检查flags行中有没有lm标记&#xff0c;lm是Long Mode的简写&#xff0c;表示支持64位模式。 #getconf LONG_BIT 输出&#xff1a;32 #getconf WORD_BIT 输出&#xff1a;32 32位的系统中int类型和long类型一般都是4字节&…

malloc一次性最大能申请多大内存空间

受用户态内存地址空间的限制。64 位系统下分配几个 T 不成问题。 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。作者&#xff1a;zz matrix链接&#xff1a;http://www.zhihu.com/question/20836462/answer/22833295来源&#xff1a;知乎考…

MD5算法之C#程序

MD5算法比较特别&#xff0c;最适合用汇编语言来写&#xff0c;好多高级语言对之无能无力或效率极低。 比如我最开始尝试用Python和Euphoria编写&#xff0c;发现不太容易。相比而言&#xff0c;C#作为C家簇 中新兴的一门.net语言&#xff0c;功能比较全面。花了一晚上的工夫终…

unix环境汇编语言常用工具

汇编器 MASM&#xff1a;微软的汇编器不支持unix NASM&#xff1a;unix环境下兼容微软平台 GAS&#xff1a;GNU 的免费软件包&#xff0c;unix环境下最流行跨平台汇编器 安装GNU汇编器 检查binunits RedHat #rpm -qa |grep binunits Debian #dpkg -l|grep binunit 下载地…

用Python远程登陆服务器的最佳实践

来源 | Python编程时光&#xff08;ID: Cool-Python&#xff09;在使用 Python 写一些脚本的时候&#xff0c;在某些情况下&#xff0c;我们需要频繁登陆远程服务去执行一次命令&#xff0c;并返回一些结果。在 shell 环境中&#xff0c;我们是这样子做的。$ sshpass -p ${pass…

Exchange Server 2013 LAB Part 4.内部客户端访问

关于Exchange服务器内部客户端访问的更详细介绍&#xff0c;请参考Exchange Server 2010链接&#xff1a;http://xutonglin.blog.51cto.com/8549515/1390715每个组织在AD林中都至少有一台客户端访问服务器和一台邮箱服务器。另外&#xff0c;每个AD站点中都必须至少有一台客户端…

VirtualBox安装64位Linux

VirturlBox安装64位的Linux 原因 virtualbox 本身不带 64 位支持&#xff0c;它的 64 位支持依赖于通过cpu虚拟技术把cpu的64位指令直接映射过去。 所以&#xff0c;要支持64位必须&#xff1a; 1.你的cpu支持64位。 2.你的cpu支持虚拟化&#xff0c;并且你的bios支持把cpu虚…

6个步骤,告诉你如何用树莓派和机器学习DIY一个车牌识别器!(附详细分析)...

作者 | Robert Lucian Chiriac翻译 | 天道酬勤&#xff0c;编辑 | Carol出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;几个月前&#xff0c;作者开始考虑让汽车能够具备检测和识别物体的能力。他很喜欢这个主意&#xff0c;因为已经见识到了特斯拉的能力…

推荐bpython

可能很多人都对ipython比较熟悉&#xff0c;但是我这里要推荐的是bpython&#xff0c;我发现用起来更加顺手。详细的信息可以从其官方网站上获得。下面介绍几个主要的feature&#xff08;使用系统为Linux&#xff09;&#xff1a;1. 语法高亮&#xff1a;2. 自动提示&#xff0…

几个定制 iTerm2 的 tip

重装 Mac 才想起来很多配置没有备份过, 找起来麻烦, 所以记一下 按文本开头搜索命令 一个是 Bash 里按上下键直接查找历史, 匹配开头相同的内容最开始是我朋友在 Matlab 下用到提到想要这个方案, 一起找了结果真有于是记录一下配置: ➤➤ cat ~/.inputrc "\e[A":hist…

从1的补码说起计算机的数制

字节换算 bit(b)位 字节(byte)8位 -128~127 0&#xff5e;255 半字2字节16位 -32768~32767 0&#xff5e;65,535 字(word)4字节32位 -2147483848~2147483647 0&#xff5e;4,294,967,295 双字8字节64位 -9223372036854775808~9223372036854775807 0&#xff5e;18,446,744…

类:认识类的继承

先新建一个 VCL Forms Application 工程, 代码中就已经出现了两个类:一个是 TForm 类; 一个是 TForm1 类; TForm1 继承于 TForm.TForm 是 TForm1 的父类; TForm1 是 TForm 的子类. Codeunit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, C…

机器会成为神吗?

作者 | Roman Wiligut翻译 | 天道酬勤&#xff0c;编辑 | Carol出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;看着科技的飞速发展&#xff0c;我们越来越想知道&#xff0c;到底科技发展有没有极限呢&#xff1f;在我看来&#xff0c;没有。至少在我们的…

1、Linux汇编——初识汇编

2019独角兽企业重金招聘Python工程师标准>>> 前序 本来想Qt能继续坚持下来&#xff0c;可是绕了一大圈&#xff0c;最终还是选择回到学期伊始的Linux汇编编程上来。鉴于图书馆只能借到这本书&#xff0c;虽然不厚&#xff0c;但是内容还是比较实用丰富&#xff0c;作…