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=当前路径
现在运行程序就可以得到正确的结果了
linux下创建和使用自己的动态链接库,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/candycloud/p/3847456.html