在CentOS/Ubuntu系统上将opencv的静态库(.a)打包成项目中所需的动态库文件(.so)(使用CMakeLists.txt实现)

CMakeLists文件如下:

cmake_minimum_required (VERSION 2.8)  
project(vinJava)  

set (CMAKE_BUILD_TYPE Release)

# Use C++11
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -lpthread  -ldl  -std=c++11" ) # -lpthread
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")

SET (VIN_SRCS
    sources/LSY_regression.cpp
    sources/other_deal.cpp
    sources/recognize.cpp
    sources/YOLO_V3.cpp
    sources/JNIDemo.cpp
)
SET (VIN_HDRCS
    include/LSY_regression.h
    include/other_deal.h
    include/recognize.h
    include/YOLO_V3.hpp
    include/JNIDemo.h
)
SET(VIN_OPENCV
    libopencv_highgui.a
    libopencv_imgcodecs.a
    libopencv_imgproc.a
    libopencv_dnn.a
    libopencv_core.a
    liblibpng.a
    liblibjpeg-turbo.a
    liblibjasper.a
    libIlmImf.a
    libzlib.a
    libippicv.a
    liblibprotobuf.a
    liblibwebp.a
    libittnotify.a
    libippiw.a
)
include_directories(/usr/local/include/opencv4)
include_directories(/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-0.el7_6.x86_64/include) 
include_directories(/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-0.el7_6.x86_64/include/linux)
include_directories(/home/wangjiao/jiao_code/jni/vinJava/include)
link_directories(/home/wangjiao/jiao_software/opencv410/jiao_opencv4/lib/opencv4/3rdparty)
link_directories(/usr/local/lib64)
link_directories(/usr/local/lib64/opencv4/3rdparty)

find_package(OpenCV 4.1.0 REQUIRED)

add_library(vinJava SHARED ${VIN_SRCS}) 

target_link_libraries(vinJava
    -Wl,--start-group
    ${VIN_OPENCV}
    -Wl,--end-group

)

编写CMakeLists.txt文件,依次执行cmake . 和make命令,则生成.so文件

CMakeLists文件语法:

1、cmake_minimum_required(VERSION 3.4.1)

该命令用于指定cmake的最小版本

2、project(XXX)

该命令用于确定工程名

3、set (CMAKE_BUILD_TYPE Release/Debug)

该命令用于设置编译模式

4、include_directories()

该命令用于设置.h文件所在路径

用以下命令同样可以设置.h文件所在路径:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}/h_file_dir")

5、link_directories()

该命令用于设置链接库文件所在路径(Linux下静态库文件的后缀为.a,Linux下动态库文件的后缀为.so,windows下的动态库文件的后缀为.dll,windows下的静态库文件为.lib)

用以下命令同样可以设置库文件所在路径:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_CURRENT_SOURCE_DIR}/lib_file_dir")

6、target_link_libraries()

该命令用于连接指定的库文件,第一个参数为生成的目标文件的文件名

-Wl,--start-group

-Wl,--end-group

“-Wl,”表示后面跟着的参数是传递给链接器ld的。“--start-group”表示范围的开始;“--end-group”表示范围的结束。这两行参数可保持被依赖的库放在前头,即可保证生成的文件不必要根据库文件的顺序来进行连接。否则在生成目标文件时会根据库文件的顺序进行连接,这样可能会报错!!!

7、add_library()

该命令的主要作用就是将指定的源文件生成链接文件

该命令的第一个参数为生成的目标文件的文件名,第二个参数是指定生成的库文件的类型,分别为为STATIC、SHARED和MODULE,STATIC代表生成的目标文件为静态库,SHARED代表生成的目标文件为动态库。

8、set()

该命令用于设置变量的值,第一个参数为变量名,之后的参数为所需的文件名

9、find_package()

该命令可用于查找opencv的依赖包

10、add_executable()

该命令用于生成可执行文件

cmake执行命令:

将CMakeLists.txt放在当前目录下,执行CMakeLists.txt

  1. $> cmake .

  2. $> make

  3. $>make clean (make clean 操作,如果编译成功则不执行该命令)

备注:

1、以上的CMakeLists.txt文件生成的.so文件为JNI的.so文件,因为该txt中包含了java的头文件!!!去掉该头文件则生成的为C++的.so文件!

2、add_library()或add_executable()一定要放在include_directories()和link_directories()后面,否则可能会报找不到某些库文件的错误!

参考文章:

https://blog.csdn.net/afei__/article/details/81201039

https://blog.csdn.net/u010122972/article/details/78216013

https://www.jianshu.com/p/39fc5e548310(find_package()的具体用法参考)

 

你可能感兴趣的:(在CentOS/Ubuntu系统上将opencv的静态库(.a)打包成项目中所需的动态库文件(.so)(使用CMakeLists.txt实现))