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
$> cmake .
$> make
$>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()的具体用法参考)