GCC编译四阶段

  Linux下程序编译的四个阶段:预处理、编译、汇编、链接

GCC: GUN  C Compiler 但现在不只局限于c语言

预处理(Preprocessing):  gcc  -E  hello.c -o hello.i  -E选项意思不晓得

  1、在源程序中插入include包含的头文件;

  2、宏定义的替换

编译(Compilation): gcc  -S  hello.i   -o  hello.s    -S选项意思也不晓得

  1、检查代码的规范性,语法错误等;

  2、把预处理的文件编译成汇编语言;

汇编(Assembly):   gcc -c   hello.s  -o hello.o    -c选项意思也不晓得

  1、将汇编语言汇编汇编成机器语言(二进制);

链接(Linking):   gcc   hello.o   -o hello

  1、将汇编生成的文件与相应的库(动态库,静态库)进行链接(确定动态库文件的位置),生成可执行的二进制文件;

gcc下的汇编器:as  链接器:gas

静态库链接时搜索路径顺序:

1. ld会去找GCC命令中的参数-L
2. 再找gcc的环境变量LIBRARY_PATH(命令行中查看:echo $LIBRARY_PATH )
3. 再找内定目录 /lib 和 /usr/lib 和 /usr/local/lib 这是当初compile gcc时写在程序内的

动态链接时、执行时搜索路径顺序:

1. 编译目标代码时指定的动态库搜索路径
2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径(命令行中查看:echo $LD_LIBRARY_PATH )
3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
4. 默认的动态库搜索路径/lib
5. 默认的动态库搜索路径/usr/lib

有关环境变量:在/etc/profile 或者 ~/.bash_profile设置
BRARY_PATH环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径

#在PATH中找到可执行文件程序的路径。
export PATH =$PATH:$HOME/bin

#gcc找到头文件的路径
C_INCLUDE_PATH=/usr/include/libxml2:/MyLib
export C_INCLUDE_PATH

#g++找到头文件的路径
CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/libxml2:/MyLib
export CPLUS_INCLUDE_PATH

#找到动态链接库的路径
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/MyLib 
export LD_LIBRARY_PATH

#找到静态库的路径
LIBRARY_PATH=$LIBRARY_PATH:/MyLib
export LIBRARY_PATH

 

下面是在gcc命令中手动设置搜索路径:

#添加头文件搜索路径

 

# gcc foo.c -I /home/xiaowp/include -o foo

 

#添加动态库搜索路径

 

# gcc foo.c -L /home/xiaowp/lib -lfoo -o foo

 

#添加静态库搜索路径

 

# gcc foo.c -L /home/xiaowp/lib -static -lfoo -o foo

 

时间: 2024-08-31 16:40:03

GCC编译四阶段的相关文章

gcc vc++6.0-同样代码VC6.0结果正确,GCC编译运行结果不正确,原因是什么呢?谢谢!

问题描述 同样代码VC6.0结果正确,GCC编译运行结果不正确,原因是什么呢?谢谢! #include int main() { char deno[1000]={''},num,i=0,remain=0; scanf("%s %d",deno,&num); //获取被除数.除数 if(!num) return (-1); while(deno[i]!='') deno[i++]-='0'; //转换成数字 deno[i]='#'; //结束标志 i=0; while(deno

c语言编程-gcc编译没有错,就出不了结果,谁能帮我看下,多谢

问题描述 gcc编译没有错,就出不了结果,谁能帮我看下,多谢 #include int main(int argc, char *argv[]) { int n,x,y,i=0,a[100]; scanf("%d",&n); for(i=0;i<n;i++) { a[i]=i+1; } x=0; y=n; while(y>1) { for(i=0;i<n;i++) if(a[i]!=0) { x++; if(x%3==0) { a[i] = 0; y--; }

和菜鸟一起学c之gcc编译过程及其常用编译选项【转】

转自:http://blog.csdn.net/eastmoon502136/article/details/8162626 版权声明:本文为博主东月之神原创文章,未经博主允许不得转载.        上篇文章,知道了,C代码编译后存放在内存中的位置,那么C代码的整个编译过程又是怎样的呢?一条命令gcc hello.c就可以编译成可执行程序a.out,然后./a.out之后就可以执行hello.c这个程序的代码了.下面的文章分析的不错,就整理了下. hello.c:     [html] vie

OS X下gcc编译报错,Xcode带的gcc

问题描述 OS X下gcc编译报错,Xcode带的gcc 错误是 dpc2sim.a file was built for archive which is not the architecture being linked (x86_64) 用Data Prefetch Championship给的framework写prefetch的程序http://comparch-conf.gatech.edu/dpc2/想先跑跑人家给的example,可是编译的时候就报错了.我用的是OS X,gcc版

ubuntu_14.04下gcc编译问题

问题描述 ubuntu_14.04下gcc编译问题 main函数体仅打印hello,world,gcc发现如下问题,不解: 头文件无#include,gcc不报错而报警告,为什么? 函数体中使用"exit(EXIT_SUCCESS);"代替"return(0);"需要使用头文件#include .如果头文件不加入,会报错 : "hello.c:9:7: error: 'EXIT_SUCCESS' undeclared (first use in this

c语言-Linux下使用gcc编译c11程序是不是过于麻烦了?

问题描述 Linux下使用gcc编译c11程序是不是过于麻烦了? 每次都要输入-std=c11 是不是过于麻烦了?怎么让它默认为-std=c11? 解决方案 因为它默认是c89等标准,所以需要指定 你可以写一个makefile ,这样每次只用make来编译

gcc编译出现了undefined reference to `exp&amp;amp;#39;

问题描述 gcc编译出现了undefined reference to `exp' 在Ubuntu下编译word.cgcc -lm -pthread word.c -o word还是出现了undefined reference to `exp',后来有gcc -pthread word.c -o word /usr/lib/libm.a则提示没有/usr/lib/libm.a这个文件, 有没有有经验的大侠有解决办法? 解决方案 首先确定有libm.so,虽然一般是肯定有的,locate libm

在ubuntu使用gcc编译一个基本签名算法出现 段错误 核心已转储 麻烦给看看程序有什么错误。

问题描述 在ubuntu使用gcc编译一个基本签名算法出现 段错误 核心已转储 麻烦给看看程序有什么错误. 可能程序存在不止一个错误,如果可以,麻烦一一指出 如果哪位高手能帮忙让程序跑出结果,我把剩下的140C送给他作为感谢! #include "pbc.h" int main(void) { pairing_t pairing; element_t g, h; element_t public_key, sig; element_t secret_key; element_t tem

c语言-aix下使用gcc编译c代码,不支持tls?

问题描述 aix下使用gcc编译c代码,不支持tls? aix下使用gcc编译c代码,不支持tls error: thread-local storage not supported for this target 代码中使用了"__thread"关键字 有人知道怎么解决吗? 解决方案 linux下使用gcc命令编译代码Linux系统中使用GCC 对CPU参数优化代码编译GCC编译C/C++/汇编代码