Linux下编译链接动态库

对于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静态库-下

参考:linux cmake分别指定编译/运行时动态库链接路径

猜你喜欢

转载自blog.csdn.net/juluwangriyue/article/details/108519559