1 动态库的建立使用
首先建立一个头文件,和三个.cpp文件,目的是要把这些文件链接成动态库:
其中:四个文件中的内容分别是:
- so_test.h
#include <stdio.h>
void test_a();
void test_b();
void test_c();
- test_a.cpp
#include "so_test.h"
void test_a()
{
printf("Test_a\n");
}
- test_b.cpp
#include "so_test.h"
void test_b()
{
printf("Test_b\n");
}
- test_c.cpp
#include "so_test.h"
void test_c()
{
printf("Test_c\n");
}
再建立一个测试文件:test.cpp
- test.cpp
#include "so_test.h"
#include <string.h>
int main()
{
test_a();
test_b();
test_c();
getchar();
return 0;
}
此时如果运行: g++ test.cpp -o test
,会出现错误,如果要形成编译文件:实际应该按照下面命令:g++ test.cpp test_a.cpp test_b.cpp test_c.cpp -o test
,这样能编译通过,但是后面项目中如果这些文件使用频繁,那么每次这样输入就是显得很繁琐,尤其是当编译文件非常多的时候。
所以可以把:test_a.cpp test_b.cpp test_c.cpp
三个文件封装成一个动态或者静态链接库,下面是封装过程:
2 动态库封装过程
2.1 编译动态库
- 将这几个文件编译成一个动态库:libmylib.so
g++ test_a.cpp test_b.cpp test_c.cpp -fpic -shared -o libmylib.so
动态库命名规则:链接
这样就会在自己的文件目录下生成一个文件:
2.2 使用动态库
- 使用动态库:libmylib.so
g++ test.cpp -L. libmylib.so -o test
会生成可执行文件:
2.3 命令参数说明
- gcc动态库生成参数说明:
最主要的是GCC命令行的一个选项:
-shared
—该选项指定gcc编译器生成动态连接库,而不是可执行文件
-fPIC
—表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。正是使用这个,使得动态链接库不用再编译时拷贝库函数的完整代码,实现真正的动态链接。
-L.
—指定编译的时候动态链接库的位置,这里使用 -L. 后面跟了一个点表示要连接的库在当前目录中
//下面的暂时不用看
(4)-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
另外:
(1)LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
(2)当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。
3 静态库封装过程
3.1 静态库的封装
使用 g++ 生成静态库的命令通常如下:
g++ -c source_files -fPIC
ar rcs liblibrary_name.a object_files
在本文中命令就是:
g++ -c test_a.cpp test_b.cpp test_c.cpp
ar rcs libmylibray.a test_a.o test_b.o test_c.o
其中:
-c
选项用于只进行编译,生成目标文件。-fPIC
(位置无关代码)选项,以便生成的代码可以用于创建共享库。source_files
是你的源文件。object_files
是编译生成的目标文件。liblibrary_name.a
是生成的静态库的名称。
首先,使用 -c
编译源文件,然后使用 ar
工具将目标文件打包成静态库。
3.2 静态库的使用
在使用静态库时,一般需要以下步骤:
- 编译生成静态库。
- 在其他代码中使用静态库,常见的命令如下:
g++ main_source_file.cpp -Lpath_to_static_library -lstatic_library_name
其中:
main_source_file.cpp
是你的主源文件。-Lpath_to_static_library
指定静态库所在的路径。-lstatic_library_name
指定要使用的静态库的名称。
这样编译后,就会将静态库中的代码链接到你的程序中。
例如在本次里面要进行的命令就是:
g++ test.cpp -L. libmylibray.a -o test
;
会生成一个可执行文件: