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)