第四章 如何生成动态、静态链接库并使用

一、如何生成动态链接库并使用

1、生成动态链接库

在第三章创建的project1工程里面把main.cpp的main函数名更名为maina。

iOS 动态链接 怎么做动态链接_静态链接库

打开project1.pro,将TEMPLATE = app改为TEMPLATE = lib。

iOS 动态链接 怎么做动态链接_动态链接库_02

执行“qmake”生产新的Makefile,再执行“make”编译。

iOS 动态链接 怎么做动态链接_静态链接库_03

编译过程中用ln指令生产了动态链接库的软链接文件。make编译工程时,就执行“ln -s”建立指向libproject1.so.1.0.0的3个软链接文件(libproject1.so,libproject1.so.1和libproject1.so.1.0)。程序在链接动态库时,默认搜索“.so”后缀的文件,因而为了能使用这些库,需要建立指向它们的软链接(链接名以.so为后缀),这就是工程编译的时候建立软链接的意义。

2、使用动态链接库

当第三方程序链接库libproject1.so时,调用maina即可绘制出一个软件界面。细节都在库中实现了,使用者只需调用接口。执行下面指令:

iOS 动态链接 怎么做动态链接_动态库_04

在mylib.h输入以下代码保存

iOS 动态链接 怎么做动态链接_iOS 动态链接_05

库和库的接口定义文件都齐备了,接下来在testlib目录下编写使用这个库的测试代码test.cpp,内容如下:

iOS 动态链接 怎么做动态链接_静态链接库_06

最后就是编译测试

iOS 动态链接 怎么做动态链接_动态库_07

"-I"来指定库的头文件搜索路径;“-L”指定动态库所在的路径;“-lproject1”告诉编译器具体找哪个库,注意:我们写的是“-lproject1”,并不是“-llibproject1”,能这样写也是因为Linux对动态链接库命名的偏好(必须以“lib”3个字母开头)引起的。在用“-l”指定要链接的库文件名时,可以简写为“-lproject1”而不用写全。

iOS 动态链接 怎么做动态链接_动态链接库_08

执行.test时出现上面错误提示,提示找不到动态链接库,执行“ldd ./test”,查看一下test用到的动态链接库都有哪些。

iOS 动态链接 怎么做动态链接_动态链接库_09

可以看到“libproject1.so.1 => not found”,而程序用到的其他的库,如libc.so.6在“/lib”目录下,libstdc++.so.6在“/usr/lib”下可以找到。这两个路径(/lib和/usr/lib)正是Linux动态库的默认搜索路径。自己做的动态链接库(libproject1.so.1)需要复制到默认搜索路径里面,当应用程序执行是需要用到动态链接库里面的接口(maina),系统会自动地到默认搜索路径去找相应的动态库,然后把找到的动态链接库载入内存供应用程序使用。

通过加载环境变量(LD_LIBRARY_PATH)来指定动态库搜索路径。

iOS 动态链接 怎么做动态链接_iOS 动态链接_10

之前的软件界面出来了。

二、如何生成静态链接库并使用

1、生成静态链接库

在第三章创建的project1工程里面打开project1.pro,在里面添加一条语句“CONFIG += staticlib”。

iOS 动态链接 怎么做动态链接_iOS 动态链接_11

执行“qmake”生产新的Makefile,再执行“make”编译生成静态链接库libproject1.a。

iOS 动态链接 怎么做动态链接_静态链接库_12

2、使用静态链接库

在建立的testlib目录下创建teststaticlib目录,把生成的静态链接库(libproject1.a)和前面创建的mylib.h头文件以及测试代码test.cpp复制到teststaticlib目录下,执行“qmake -project”生成工程文件teststaticlib.pro,编译该文件,添加“LIBS += -L ./ -lproject1”,指定libproject1.a搜索路径,之后重新生成Makefile,编译运行工程,可以看到那个界面有蹦出来了。