Linux 下生成动态链接库(libXXX.so)并调用项目实例

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;

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhngyue123/article/details/113930590