gcc 学习笔记(备忘)

来源:互联网 发布:gre软件 编辑:程序博客网 时间:2024/05/16 02:17
gcc编译程序的过程


预处理(Pre-Processing)
编译(Compiling)
汇编(Assembling)
链接(Linking)


选项名
作用
-o
产生目标(.i、.s、.o、可执行文件等)
-c
通知gcc取消链接步骤,即编译源码并在最后生成目标文件
-E
只运行C预编译器
-S
告诉编译器产生汇编语言文件后停止编译,产生的汇编语言文件扩展名为.s
-Wall
使gcc对源文件的代码有问题的地方发出警告
-Idir
将dir目录加入搜索头文件的目录路径
-Ldir
将dir目录加入搜索库的目录路径
-llib
链接lib库
-g
在目标文件中嵌入调试信息,以便gdb之类的调试程序调试



静态库与共享库


静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库

共享库( .so或.sa ):程序在运行的时候才去链接共享库的代码,多个程序共享使用库的代码。



一个与共享库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该共享库中复制到内存中,这个过程称为动态链接(dynamic linking)
共享库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份共享库被要用到该库的所有进程共用,节省了内存和磁盘空间。
生成静态库

hello_fn.h
hello_fn.c
main.c
gcc -Wall hello_fn.c -o hello_fn.o
ar rcs libhello.a hello_fn.o
ar是gnu归档工具,rcs表示(replace and create)
gcc -Wall main.c libhello.a -o main
gcc -Wall -L. main.c -o main -lhello


库搜索路径
C_INCLUDE_PATH、LIBRARY_PATH
从左到右搜索-I -L指定的目录。
由环境变量指定的目录
由系统指定的目录


生成共享库
shared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)
库名规则:libxxx.so
示例:gcc -shared -fPIC hello.o –o libhello.so
使用共享库
编译选项
l:链接共享库,只要库名即可(去掉lib以及版本号)
L:链接库所在的路径.
示例:
gcc main.o -o main –L. -lhello

运行共享库

q1、拷贝.so文件到系统共享库路径下
    一般指/usr/lib
q2、更改LD_LIBRARY_PATH
q3、ldconfig
 配置ld.so.conf,ldconfig更新ld.so.cache



0 0
原创粉丝点击