gcc 静态链接库动态链接库工具小结

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

猜你喜欢

转载自blog.csdn.net/m0_38036750/article/details/85274439
今日推荐