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即可。