对于Linux下的c++部署来说,最头疼的就是动态库依赖了。在本地运行很好的程序换一台机器可能就不好用了。(此处暂时不考虑docker)
因为安装在本地的动态库在部署的机器上没有,就算有路径也未必一致,版本也不一定一致,最常见的就是依赖opencv,一般解决办法就是使用opencv静态库,然后编译时把opencv静态库链接进去,这样就没有opencv依赖库的问题了。
还有就是cuda依赖库问题,网上查得CUDA从CUDA5.5开始,支持static library。
如果没有静态库我们就会遇到很多麻烦,所以考虑一下其他解决方案。
Linux下编译链接动态库
1、使用makefile
2、使用CMakeLists.txt
下面的CMakeLists.txt仅供参考:
cmake_minimum_required(VERSION 3.5)
project(dbnet_demo LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(OpenCV 3.1.0 REQUIRED)
set(OPENCV_DYNAMIC_LIBS "${CMAKE_CURRENT_SOURCE_DIR}/../libs") # 动态 opencv native 库路径
add_library(libopencv_core SHARED IMPORTED )
set_target_properties(libopencv_core PROPERTIES IMPORTED_LOCATION "${OPENCV_DYNAMIC_LIBS}/libopencv_core.so")
add_library(libopencv_imgcodecs SHARED IMPORTED )
set_target_properties(libopencv_imgcodecs PROPERTIES IMPORTED_LOCATION "${OPENCV_DYNAMIC_LIBS}/libopencv_imgcodecs.so")
add_library(libopencv_imgproc SHARED IMPORTED )
set_target_properties(libopencv_imgproc PROPERTIES IMPORTED_LOCATION "${OPENCV_DYNAMIC_LIBS}/libopencv_imgproc.so")
set(mOpenCV_LIBS libopencv_core libopencv_imgcodecs libopencv_imgproc)
message(STATUS "Opencv library status: ")
message(STATUS "> version: ${OpenCV_VERSION} ")
message(STATUS "> library: ${OpenCV_LIBS} ")
message(STATUS "> include: ${OpenCV_INCLUDE_DIRS} ")
# Add OpenCV headers location to your include paths
include_directories(${OpenCV_INCLUDE_DIR})
set(Torch_DIR /mnt/hgfs/vmsharefolders/libtorch/share/cmake/Torch)
find_package(Torch REQUIRED)
add_executable(dbnet_demo test_db.cpp clipper.cpp)
target_link_libraries(dbnet_demo ${mOpenCV_LIBS}
"${TORCH_LIBRARIES}" )
set_property(TARGET dbnet_demo PROPERTY CXX_STANDARD 17)
上面的内容只指定了opencv的相对路径,经过验证该方法正确,至于怎么找到这些依赖库是在不使用相对路径时编译通过,然后通过ldd查找依赖库,再把依赖库放到相对路径下,除了opencv这三个库外还有libz,libzstd,libjasper,libpng,libjpeg.
同时需要注意的是,我们拷贝过来的即要有真正的库也要有链接库,否则会包找不到;另一个可能的解决办法就是尝试一下libopencv_core.so换成libopencv_core.so.3.4.2(真正的库),其他库操作类似。
参考: linxu下CUDA静态库-下