1. hello.h文件
#ifndef _HELLO_H
#define _HELLO_H
extern "C"{
int opencv_main(char str[]);
}
#endif
2. hello.cpp文件
#include "hello.h"
#include<opencv2/opencv.hpp> //加上函数实现需要的头文件
#include<iostream>
#include<string.h>
using namespace std;
using namespace cv;
extern "C"
cv::Mat opencv_main(char str[])
{
cout << "str=" << str << endl;
Mat Image = imread(str);
//imshow("Image", Image);
//waitKey(0);
//imwrite("0.png", Image);
return Image;
}
到现在就可以编译生成.so文件了
g++ -shared -fPIC -o libhello.so hello.cpp
运行这行命令行生成libhello.so文件
注意,-shared参数和-fPIC参数非常重要:
-shared 告诉gcc要生成的是动态链接库;
-fPIC 告诉gcc生成的生成的代码是非位置依赖的,方面的用于动态链接。
最后进行测试
3. main.cpp
#include "hello.h"
#include<iostream>
#include<string>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
char str[]="/home/zhy/Desktop/so/0783.jpg";
cv::Mat A=opencv_main(str);
imshow("Image", A);
waitKey(0);
imwrite("0.png", A);
return 0;
}
这是在本地环境下(带有OpenCV运行环境),程序的图片路径需要自己进行设置
g++ -o main main.cpp -L. -lhello
运行可生成可执行文件main
-L.: 在当前路径下寻找.so文件
-lhello: 要链接这个libhello.so文件
注:
- -c 表示编译代码
- -o 表示指定生成的文件名
- -g 表示编译时候加入调试符号信息,debug时候需要这些信息
- -I (大写i)表示设置头文件路径,-I./表示头文件路径为./
- -Wall 表示输出所有警告信息
- -D 表示设置宏定义,-DDEBUG表示编译debug版本,-DNDEBUG表示编译release版本
- -O 表示编译时候的优化级别,有4个级别-O0,-O1,-O2 -O3,-O0表示不优化,-O3表示最高优化级别
- -shared 表示生成动态库
- -L 指定库路径,如-L.表示库路径为当前目录
- -l (小写L)指定库名,如-lc表示引用libc.so
如果出现如下问题
表示没有链接到本地OpenCV的环境,命令行后面加上下面命令
g++ -o main main.cpp -L. -lhello `pkg-config --cflags --libs opencv`
注:命令的引号不是普通的引号,是ESC下面的按键
4. Makefile
CROSS_COMPILE =
.PHONY : clean
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CROSS_COMPILE)g++ -fPIC
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)OBJDUMP
RANLIB = $(CROSS_COMPILE)ranlib
CFLAGS = -I /usr/local/include/libhello/
LDFLAGS = -L /usr/lib/ -lhello
OBJS =
all: clean main
main:
$(CPP) -g -o main main.cpp -lpthread -lhello `pkg-config --cflags --libs opencv`
%.o: %.c
$(CPP) $(CFLAGS) -g -fPIC -c $< -o $@
clean :
rm -fr *.o libhello.so main
install:
cp libhello.so /usr/lib/
ldconfig
uninstall:
rm -f /usr/lib/libhello.so
运行步骤:
sudo make install; // 安装libhello.so库(新系统执行一次)
sudo make ;
sudo ./main;