gcc的常用选项:
选项 | 作用 |
-o | 产生目标(.i、.s、.o、可执行文件等) |
-c | 通知gcc取消链接步骤,即编译源码并在最后生成目标文件 |
-E | 只运行C预编译器 |
-S | 告诉编译器产生汇编语言文件后停止编译,产生的汇编语言文件扩展名为.s |
-Wall | 使gcc对源文件的代码有问题的地方发出警告 |
-Idir | 将dir目录加入搜索头文件的目录路径 |
-Ldir | 将dir目标加入搜索库的目录路径 |
-llib | 链接lib库 |
-g | 在目标文件中嵌入调试信息,以便gdb之类的调试程序 |
使用方法:
现在有个hello world的代码:
#include <stdio.h>
#define HW printf("hello world")
int main()
{
HW;
return 0;
}
执行-E的命名:这是预处理的命令。
gcc -E 02hello.c -o hello.i
下面是打开hello.i的内容 -E是对宏定义已经头文件的展开。
下来就是编译选项了。
命令:
gcc -S hello.i -o hello.s
生成的内容为:
下一步gcc调用as工具进行汇编操作:
命令:
gcc -c hello.s -o hello.o
生成一个二进制文件。
链接
命令:
gcc hello.s -o hell
其实可以一步到位,那就是
那就是
gcc hello.c -o hello
一次编译多个文件:
gcc -Wall -c hello.c main.c -o hello
独立编译:
gcc -Wall -c hello.c -o hello.o
gcc -Wall -c main.c -o main.o
gcc -Wall hello.o main.o -o hello
有关库的补充
头文件与库文件的位置:
/usr/include 及其子目录底下的include文件夹
/usr/local/include 及其子目录下的include文件夹
/usr/lib
/usr/local/lib
如何使用外部库:
gcc -Wall calc.c -o calc -lm
-lm表示要连接libm.so或者libm.a库文件
静态库与共享库
静态库(.a):程序在编译链接的时候吧库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。
共享库(.so或.sa):程序在运行的时候才去链接共享库的代码,多个程序共享使用库的代码。
生成静态库:
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
-lhell 这个文件是链接库的意思
-lhello其中lib和后缀名是可以省略的。例如 静态链接库 libhello.a 可以省略为hello。
-L.的意思是搜索当前目录的意思。
-I 的意思值存放头文件的目录
哭的搜索路径:
C_INCLUDE_PATH、LIBRARY_PATH
从左到右搜索 -I -L指定的目录。
由环境变量指定的目录。
由系统指定的目录。
可以到~/.bash_profile 文件下配置环境变量。
生成共享库:
shared:表示生成共享库格式
fPIC:产生生成位置无关码
库命令规则:libxxx.so
示例:gcc -shared -fPIC hello.o -o libhello.so
使用共享库
编译选项
I :链接共享库,只要库名称即可(去掉lib以及版本号)
L:链接库所在的路径
示例:
gcc main.o -o main -L. -Ihello
运行共享库:
1.拷贝.so文件到系统共享库路径下,一般是/usr/lib
2.更改LD_LIBRARY_PATH
3.ldconfig 配置ld.so.conf、ldconfig更新ld.so.cache