linux下 动态链接库的制作

来源:互联网 发布:java两个时间相减 编辑:程序博客网 时间:2024/05/20 18:51

linux下动态链接库的制作:

so可以供多个进程使用,不同进程调用同一个so文件,

so文件源程序不需要main函数,有也不会被执行。

下面通过一个简单例子,来学习.so文件的制作跟使用。

/*  * max.h  *  */    /*条件编译*/  #ifndef MAX_H_  #define MAX_H_    #ifdef __cpluscplus  extern "C"{  #endif     int max(int a,int b);  
#endif /* MAX_H_ */  

/*  * max.cpp * */
#include "max.h"int max(int a,int b)  {      return a>b?a:b;  }  

链接库的制作:

编译c程序:gcc -shared -fpic XXX.c -o XXX.so编译c++程序:g++ -shared -fpic XXX.cpp -o XXX.so
/*  * main.cpp  *  */  #include <stdio.h>  #include "max.h"  int main(void)  {      printf("call max function results is: %d\n",max(20,12));      return 0;  }  /* 使用libmax.so库  * gcc -o  main main.c -L. -lmax  *  *-L.: 在当前路径下寻找.so文件  *-lmax: 要链接这个libmax.so文件  *  * */  

编译main.cpp

       g++ -o main main.cpp -lmax

此时需要注意的是应该把libmax.so 放到/usr/lib目录中否则会出现错误

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

      ./main 结果出现20说明动态链接库制作正确。

如果要是在QT中调用,需要加上头文件和.so文件的绝对路径

INCLUDEPATH + =" "
LIBS += ""


$ g++ hello.cpp  -fPIC -shared -o libhello.so

$ g++ main.cpp -L. -lhello -o main

交叉编译步骤一致:

(1)  $arm-linux-g++ hello.cpp -fPIC -shared -o libarmhello.so

(2)  $arm-linux-g++ main.cpp -L. -larmhello -o armhello

交叉编译的时候出现错误:fatal error:opencv2/imgproc/imgproc.hpp:no such file or directory

解决方法:把交叉编译好的opencv下的include中的opencv2拷贝到交叉编译器中的include下

我的交叉编译好的opencv和opencv2路径是在:/opt/arm/include  

/opt/arm/include  文件下的opencv2 复制到/opt/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/include即可。


0 0
原创粉丝点击