linux gcc编译c文件头文件,使用GCC编译器编译C语言
凶猪下山
转载
关注
0点赞·1047人阅读
GCC编译C源代码有四个步骤:预处理—->编译—->汇编—->链接。
可以利用GCC的参数来控制执行的过程,这样就姿耐可以更深入的了解编译C程序的过程。
下面将通过对一个程序的编译来演示整个过程。
#include
int main()
{
printf("happy new year!\n")
return 0
}
1:预处理:编译器将C程序的头文件编译进来,还有宏的替换,可以用gcc的参数-E来参看。
预处理 命令:gcc -E hello.c -o hello.i
作用:将hello.c预处理输出hello.i
2:编译:这个阶段编译器主要做词法分析、语法分析、语义分析等,在检查无错误后后,把代码翻核凳译成汇编语言。可用gcc的参数-S来参看。
编译器(ccl)将文本文件hello.i 翻译成文本文件hello.s, 它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式描述了一条低级机器语言指令。
编译命令:gcc -S hello.i -o hello.s
作用:将预处理输出文件hello.i汇编成hello.s文件
3:汇编:把编译阶段生成的.s 文件转换为二进制目标代码。可用gcc的参数-c来参看。汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成可重定位目标程序的格式, 并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是机器语言。
汇编 命令:gcc -c hello.s -o hello.o
作用:作用:将汇编输出文件hello.s编译输出hello.o文件
4:链接:把obj文件链接为可执行的文改册旅件:链接器(ld)负责.o文件的并入。结果就是hello文件,它是一个课执行的目标文件,可以加载到存储器后由系统调用。
链接命令:gcc hello.o -o hello
一步 *** 作的话是: (-o必须在hello之前 )
$gcc hello.c -o hello
$./hello或者:(会默认生成a.out文件)
$gcc hello.c
$./a.out
要么就使用绝对路径, 要么就使用工程. 如橘宽笑:#include "c:\foo\foo.h" 使用工程的话就是新建一个工程, 工程圆含建好之后会有source files, header files, other files三个目录, 你用右键把头文件添加到header files里边即可 工程的话实际上也是使用了绝对路径, 只是工程文件帮你巧察做了文件的搜寻工作. 如果是在linux下使用GCC编译器的话,把头文件放在当前目录也可以找到的一、compile-time库文件搜索路径
1.如果编译时指定了-L选项,就优先到-L指定的路径去查找库进行连接;
2.查找GCC的环境变量LIBRARY_PATH
3.到/bin /usr/lib /usr/local/lib去查找。这几个搜索路径在gcc下是默认的。
所以当我们要让自己添加的库文件让gcc能搜索到,有两种方法,一种就是用-L指定,一种就是将库复制到以上几个gcc默认搜索路径。
二、run-time库搜索路径
1.编译时用-Wl, -rpath指定的路径
Ex:
arm-none-linux-gnueabi-gcc -o helloword_arm helloword.c -Wl,-dynamic-linker=/system/lib/ld-linux.so.3,-rpath,/system/lib/
2.环境变量LD_LIBRARY_PATH指定的路径
3./etc/ld.so.conf指定的路径
4.默认的动态搜索库路径/lib /usr/lib
LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下:
LIBRARY_PATH环境变量用于在程序编译期间查找动大链态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录):
export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LIBRARY_PATH
LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径滚仿孙,注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录):
export LD_LIBRARY_PATH=LIBDIR1:LIBDIR2:$LD_LIBRARY_PATH
举个例子,我们开发一个程序,经常会需要使用某个或某些动态链接库,为了保证程序的可移植性,可以先将这些编译好的动态链接库放在自己指定的目录下,然后按照上述方式将这些目录加入到LD_LIBRARY_PATH环境变量中,这样自己的程序就可以动态链接后加载库文件运行了。
区别与使用:
开发时,设置LIBRARY_PATH,以便gcc能够找到编译时需要的动态链接库。
发布时,设置LD_LIBRARY_PATH,以便程序加载运行时能够自动找到需要的动态链接库。
三、几个重要的命令
1)ldd bin_name
可以查看编译出来的可执行文件依赖的库。部署程序时,我们要把这些库拷贝出来,然后将这些库连同可执行文件大渗拷贝到新的机器上,在/etc/ld.so.conf.d下添加对应的库文件搜索路径即可。
2.ldconfig命令
搜索/lib和/usr/lib以及/etc/ld.so.conf下列出来的所有路径的库,然后创建动态库的cache文件。当程序需要搜索库时就会搜索ld.so.cache里列出来的库。
所以当我们向系统添加新的库文件时,除了需要把库文件烤到/usr/local/lib等指定位置外,还需ldconfig一下来更新cache文件。
四、gcc头文件的搜索路径
1.优先搜索-I指定的路径
2.查找GCC的环境变量C_INCLUDE_PATH/CPLUS_INCLUDE_PATH/OBJC_INCLUDE_PATH指定的路径
3.查找默认的搜索路径/usr/include /usr/local/include
所有GCC的环境变量,我们都可以GCC的原有搜索路径上上面添加进我们自己的路径,例如
#增加.so搜索路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home//lib
#增加.a搜索路径
LIBRARY_PATH=$LIBRARY_PATH:/home/lib
#增加bin搜索路径
export PATH=$PATH:/home/bin
#增加GCC的include文件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/home/include
-wall -pedantic
-wall编译时显示所有的警告信息,可以增加程序的健壮性和可移植性
-pedantic,以符合ANSI/ISO C 标准列出所有警告
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)