Ubuntu生成so共享库的方法

生成简单的so共享库

C++库文件

my_add.cpp

#include <iostream>

extern "C" int add(int a,int b);

int add(int a,int b)
{
	return (a+b);
}

C++头文件

my_add.h

extern "C" int add(int a,int b);

C++调用执行文件

test_demo.cpp

#include <iostream>
#include "my_add.h"

using namespace std;

int main()
{
	int res = add(3,5);
	cout << "result of 3+5: "<< res << endl;
	return 0;
}

CMakeLists.txt

CMakeLists.txt

#2019.12.30
#Leo Ma
cmake_minimum_required( VERSION 2.8 )
project( create_so )

set( CMAKE_BUILD_TYPE Release )
set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )

add_library(my_add SHARED my_add.cpp)
add_executable(create_so test_demo.cpp)
target_link_libraries(create_so my_add)

运行creat_so结果

在这里插入图片描述

生成链接opencv库文件的so共享库

C++库文件

opencv_draw_circle.cpp

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;
using namespace std;

extern "C" void draw_circle(int rows, int cols, unsigned char *src_data, unsigned char *ret_data);

void draw_circle(int rows, int cols, unsigned char *src_data , unsigned char *ret_data)
{
	//将unsigned char转换成Mat
	Mat src = Mat(rows, cols, CV_8UC3, src_data);
	//在图像上画一个蓝色的圆
	circle(src, Point(60, 60), 10, Scalar(255, 0, 0));
	//将Mat转换成unsigned char
	memcpy(ret_data, src.data, rows*cols * 3);
}

C++头文件

opencv_draw_circle.h

extern "C" void draw_circle(int rows, int cols, unsigned char *src_data, unsigned char *ret_data);

CMakeLists.txt

CMakeLists.txt

#2019.12.30
cmake_minimum_required( VERSION 2.8 )
project( opencv_draw_circle )

set( CMAKE_BUILD_TYPE Release )
set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )

# opencv 
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )

add_library(opencv_draw_circle SHARED opencv_draw_circle.cpp)

add_executable(test_demo_with_opencv test_demo_with_opencv.cpp)
target_link_libraries(test_demo_with_opencv ${OpenCV_LIBS} opencv_draw_circle)

运行test_demo_with_opencv结果

将图片ROI0.png放到build文件夹下,可以看到程序正确调用,画出圆圈。
在这里插入图片描述

需要注意

生成链接opencv库文件的so共享库一节中,在库文件中没有添加opencv库的链接,但在执行文件中添加了opencv库的链接,程序可以正常调用。
实际上,目前生成的so文件并不能被别的工程调用,如果需要被别的工程调用,还需要在CMakeLists.txt添加一行:

target_link_libraries(opencv_draw_circle ${OpenCV_LIBS})

完整CMakeLists.txt为:

#2019.12.30
cmake_minimum_required( VERSION 2.8 )
project( opencv_draw_circle )

set( CMAKE_BUILD_TYPE Release )
set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )

# opencv 
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )

add_library(opencv_draw_circle SHARED opencv_draw_circle.cpp)
#添加库文件libopencv_draw_circle.so的opencv链接,以使库文件单独调用时能够找到相关opencv依赖
target_link_libraries(opencv_draw_circle ${OpenCV_LIBS})

add_executable(test_demo_with_opencv test_demo_with_opencv.cpp)
target_link_libraries(test_demo_with_opencv ${OpenCV_LIBS} opencv_draw_circle)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值