书接上文,本篇博客是为博客 Linux 之 动态库与静态库 (1)的案例。
例如:
在 Linux
下,自设的 newtry
目录中包含三个文件
其中,main.c
中包含 testlib.h
,即 main.c
会调用 testlib.c
中的内容。当成功运行后,会打印出 “这是一个实验程序” !
但若直接将 main.c
进行编译,其会报错,如图
此时,若想实现 main.c
调用 testlib.c
中的内容,则可通过链接 动态库 或 静态库 来实现。
1)动态库的使用实现
a、生成二进制文件
输入代码
gcc -fPIC -c testlib.c -o testlib.o
如图中的 testlib.o
即为生成的二进制文件
b、生成动态库
输入代码
gcc --shared testlib.o ... -o libtestlib.so
注 :代码中 ...
代表的是其他 .o
文件
如图,其中的绿色字体是为生成的动态库,且动态库名称为 testlib
。
(libtestlib.so
:该库的名称为 testlib
, lib
与 .so
是命名格式)
c、链接动态库
输入代码
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
此处为了方便使用,直接采用了 “三、库的使用” 中的 “2、设置环境变量” 的操作,如图
该种方法就不用将生成的动态库保存至默认路径下了。
读者可自行尝试 “三、库的使用” 中的其他两种方法去解决库的链接,此处不再赘述。
d、库的使用
直接调用 “三、库的使用” 中的代码即可,即
gcc main.c -o mymain -ltestlib
如图,会生成 mymain
执行文件
其运行结果为
2)静态库的使用实现
a、生成二进制文件
与 1)中的 “a、生成二进制文件” 内容一致,此处不再赘述!
b、生成静态库
输入代码
ar -cr libtestlib.a testlib.o ...
注:代码中 ...
代表的是其他 .o
文件
如图,其中的 libtestlib.a
是为生成的静态库,且静态库名称为 testlib
。
(libtestlib.a
:该库的名称为 testlib
, lib
与 .a
是命名格式)
c、链接静态库
因为 1)中的 “c、链接动态库” 使用的是设置变量的方法,所以此步骤换另一个方法,即将库文件添加至默认路径下,如输入代码
sudo cp ./libtestlib.a /usr/lib64/
注:此处应添加的库文件是静态库,所以输入代码时需注意输入库文件的格式
d、库的使用
依旧是调用 “三、库的使用” 中的代码,具体见 1)中的 “d、库的使用”。
如图,会生成 mymain
执行文件
其运行结果依然为