首页 > 代码库 > linux下创建和使用自己的动态链接库

linux下创建和使用自己的动态链接库

linux下面的.so文件一般是指动态链接库文件,通过动态链接可以节省资源使得程序自身体积更小

如果多个程序使用到了相同的模块,可以更加充分的利用程序段,差别是动态库第一次加载的时候

程序肯恩会启动的慢点

下面介绍如何用G++生成和使用自己的动态链接库文件

 

实例:现在有文件replace.h 和replace.cpp通过G++将其编译成.so文件,然后在main.cpp文件中调用

replace.h文件中定义的函数

程序清单:

replace.h文件内容:

1 #include <stdio.h>
2 int length(const char* string);
3 char* replace(const char* string);

 

replace.cpp内容:

#include <stdio.h>
2 #include "replace.h"
3 int length(const char* string)
4 {
5 if (string == NULL) return 0;
6 int length = 0;
7 for (int i = 0; *(string + i) != ‘\0‘; ++i) {
8 if (*(string + i) == ‘ ‘) {
9 length += 3;
10 } else
11 ++length;
12 }
13 return length;
14 }
15
16 char* replace(const char* string)
17 {
18 int len = length(string);
19 if (len == 0) return NULL;
20 char* result = new char[len + 1];
21 int j = 0;
22 for (int i = 0; i < len; ++i, ++j) {
23 if (string[i] == ‘ ‘) {
24 result[j] = ‘%‘;
25 ++j;
26 result[j] = ‘2‘;

27 ++j;
28 result[j] = ‘0‘;
29 } else {
30 result[j] = string[i];
31 }
32 }
33 result[len] = ‘\0‘;
34 return result;
35 }
36

 

main.cpp内容:

1 #include <stdio.h>
2 #include "replace.h"
3 int main()
4 {
5 const char* p = "hjash sdfds fdsfds fds f dsf ds f s";
6 printf("%s\n", p);
7 printf("%s\n", replace(p));
8 return 0;
9 }
10

 

第一步:生成.so文件

g++ replace.cpp -fPIC -shared -o libreplace.so

这个时候ls查看当前目录可以发现已经多了一个 libreplace.so

第二步:编译连接动态库

g++ main.cpp -L -lreplace -o test

这个时候发现当前目录下面又多了一个test可执行文件

./test

结果:

./test: error while loading shared libraries: libreplace.so: cannot open shared object file: No such file or directory

原因是 libreplace.so文件并没有加入系统链接库路径

执行export LD_LIBRARY_PATH=当前路径

现在运行程序就可以得到正确的结果了