gcc预处理、编译、汇编、链接、生成动态链接库,静态链接库

-E预处理生成.i -S编译生成.s -c汇编生成.c 

-o生成可执行文件的名字

testmath.h中声明了sum方法和sub方法。sum.c中定义了sum方法,sub.c中定义了sub方法。main.c中include "testmath.h" 并调用sum方法和sub方法。gcc sum.c main.c -o main.exe生成可执行程序。

gcc -c sub.c sum.c生成sub.o sum.o,用命令ar rcs libtestmath.a sub.o sum.o生成静态链接库libtestmath.a。linux中静态链接库命名规则是libxxx.a,windows中是libxxx.lib

使用静态链接库生成可执行文件 gcc -c main.c生成main.o,gcc -static libtestmath.a main.o -o main.exe生成可执行文件,这种方式只能使用main.c同目录下的静态链接库文件。如果要使用不同目录的静态链接文件可以gcc -static -L/XXX/XXX -llibtestmath.a main.o -o main.exe,大L后面跟静态链接库对应头文件所在目录,小l后面跟静态链接库名,库的路径会自动查找,这里还可以用-I(大i)来添加额外的头文件搜索路径。

生成动态链接库两种方式:

1、gcc -shared -fpic sub.c sum.c -o libtestmath.so

2、gcc -c -fpic sub.c sum.c生成sub.o sum.o,gcc -shared sub.o sum.o -o libtestmath.so

这里-fpic是让生成的目标文件中使用相对地址,这样动态链接库在内存中什么位置运行都可以找到了。

隐式调用动态链接库生成可执行文件 gcc main.c  libtestmath.so -o main.exe。但是这样生成的可执行文件无法运行。因为无法找到动态链接库。解决这个问题要么就把动态链接库放到/lib 、/usr/lib等这些目录下,要么就修改环境变量export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:xxx。

显示调用动态链接库类似于malloc 和free这种用时分配资源,不用时释放资源,这种方式对资源利用更合理,适合做大型项目用。这种方式无需引入动态链接库的头文件,但是需要引入一个特殊的头文件#include <dlfcn.h>。用这个头文件中提供的几个方法来将动态链接库加载进内存(可以全部加载,也可以用时加载),然后获取需要的函数指针来执行函数。当这个库文件引用数为0时就会被释放。具体用法见http://c.biancheng.net/view/8044.html

posted @ 2021-01-10 01:21  大牛等等我  阅读(119)  评论(0编辑  收藏  举报