• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Opencv静态库,编译和调用静态库,静态库链接另静态库

武飞扬头像
tony365
帮助1

1. 静态库和动态库

静态库相比动态库更加独立,在生成和部署应用到相关设备的时候避免找不到动态库
Windows下静态库 lib后缀,动态库dll
linux下静态库a后缀,动态库so

2.Ubuntu编译和安装opencv静态库

首先安装依赖库

sudo apt-get install cmake  
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev

以opencv4.5为例
下载地址,下载source源码
解压后目录如下
学新通

进入源码

makedir build
cd build
cmake -D EXECUTABLE_OUTPUT_PATH:PATH=$(pwd) -D CMAKE_INSTALL_PREFIX=$(pwd)/install -D BUILD_SHARED_LIBS=OFF -D CMAKE_BUILD_TYPE=RELEASE ..
make -j8
sudo make install
# BUILD_SHARED_LIBS决定编译静态库还是动态库
# CMAKE_INSTALL_PREFIX 决定编译后的库安装的位置

完成后,在build目录下会生成install文件夹
学新通
lib下含有生成的静态库
学新通

https://blog.csdn.net/weixin_45629790/article/details/113242250
https://www.modb.pro/db/249150
https://icode.best/i/64776946383731

3. 调用opencv静态库

在ubuntu中使用QT 使用opencv库只需要在pro文件中加入

INCLUDEPATH  =  /home/opencv-4.5.5/build/install/include \
                /home/opencv-4.5.5/build/install/include/opencv4 \
                /home/opencv-4.5.5/build/install/include/opencv4/opencv2

LIBS  = /home/opencv-4.5.5/build/install/lib/libopencv_*.a -ldl
LIBS  = /home/opencv-4.5.5/build/install/lib/opencv4/3rdparty/lib*.a -ldl

其中 分别是 头文件的路径 和 库文件, dl是被依赖的库 -ldl 就是包含了 libdl

如果是使用CMakeLists中引用opencv静态库,使用下面的配置:
关于cmake的使用可以参考 CMake从入门到精通(二)静态库static library

set(OpenCV_DIR /home/opencv-4.5.5/build/install/lib/cmake/opencv4)
set(OpenCV_STATIC_INCLUDE_DIR /home/opencv-4.5.5/build/install/include/opencv4/opencv2)
find_package(OpenCV REQUIRED)
# If the package has been found, several variables will
# be set, you can find the full list with descriptions
# in the OpenCVConfig.cmake file.
# Print some message showing some of them
message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
message(STATUS "    static include: ${OpenCV_STATIC_INCLUDE_DIR}")


# lib dir
link_directories(/home/opencv-4.5.5/build/install/lib)
link_directories(/home/opencv-4.5.5/build/install/lib/opencv4/3rdparty)
# Add OpenCV headers location to your include paths
include_directories(${OpenCV_STATIC_INCLUDE_DIR})
# Link your application with OpenCV libraries
# 这里的libname, 可以是你要生成的so动态库或者a静态库,也可是可执行程序
target_link_libraries(libname ${OpenCV_LIBS})

这里的libname, 可以是你要生成的so动态库或者a静态库,也可是可执行程序, 如果时静态库就相当于 利用opencv静态库生成另一个静态库(假如为B)。那么如果有个项目要引用B库是否也要引用opencv静态库呢?
答案是需要。

4. 如何链接嵌套静态库(要链接的静态库 链接了其他静态库)

1)问题:有两个静态库a.a和b.a,静态库x.a使用a.la和b.a,x.a相当于提供了一个输出库,应用程序app使用x.a。那么,应用程序app需要连接到静态库x.lib,但它是否还需要连接到a.a和b.a?

答:app必须同时连接a.a和b.a,否则会产生连接错误。

2)问题:生成一个静态库(比如B)时链接了另一个静态库(比如A),如何链接静态库B?

答:在可执行程序的项目的 CMakeLists, Makefile 或者 qt pro文件中要首先链接静态库B再链接静态库A, 不能只链接静态库B,也不能先链接A在链接B,否则会编译错误。

举例说明:这里 libx.a引用了opencv库,因此如果有项目要引用libx.a, 不仅要调用libx.a,还要链接opencv库,
因此需要在QT pro中添加下面的语句

INCLUDEPATH  = /home/xx/3rd/inc
LIBS  = -L/home/xx/3rd -lx

INCLUDEPATH  = /home/opencv-4.5.5/build/install/include \
                /home/opencv-4.5.5/build/install/include/opencv4 \
                /home/opencv-4.5.5/build/install/include/opencv4/opencv2
LIBS  = /home/opencv-4.5.5/build/install/lib/libopencv_*.a -ldl
LIBS  = /home/opencv-4.5.5/build/install/lib/opencv4/3rdparty/lib*.a -ldl

3)问:如果我不想链接太多静态库呢?

答:可以将多个静态库合成一个静态库,这样只需链接一个静态库
在linux下执行命令,将A,B 合成一个静态库C:
ar x A.a
ar x B.a
ar rc C.a *.o

https://blog.csdn.net/wenbo_peng/article/details/49019209
https://blog.csdn.net/u012487272/article/details/12954069
https://blog.csdn.net/weixin_46089486/article/details/105533092
OpenCV静态库编译与链接

5. 调用中可能出现的问题

在编译静态库,链接静态库,和使用静态库的过程中,可能会遇到找不到相关符号的情况
解决办法

1)一种是 添加库
比如 提示缺少某个库的时候 直接 -ldl

2)另外就是 库的链接顺序可能有问题
比如下面这个例子
编译一个opencv程序,链接的时候出现大量的如下错误:

/home/admin/opencv/opencv-master/modules/imgproc/src/color_lab.cpp:23: undefined reference to `cv:😒
oftfloat::softfloat(int)’

softfloat是个什么鬼?应该链接哪个库才行?

vi /home/admin/opencv/opencv-master/modules/imgproc/src/color_lab.cpp
看见源代码里面引用了#include “opencv2/core/softfloat.hpp”
然后softfloat.hpp对应的实现文件是 softfloat.cpp
那么,只要我找到softfloat.cpp被编译到哪个库文件就行了!

于是运行: nm -A lib64/libopencv*.a | grep “softfloat.cpp”

libopencv_core.a:softfloat.cpp.o:0000000000000000 T ZNK2cv9softfloatmiERKS0
libopencv_core.a:softfloat.cpp.o:0000000000000000 T ZNK2cv9softfloatmlERKS0
libopencv_core.a:softfloat.cpp.o:0000000000000000 T ZNK2cv9softfloatneERKS0
原来是在libopencv_core.a中,命令行中已经加上了这个库,看来是依赖顺序的问题。在适当位置加上 -lopencv_core,可以解决问题。

https://www.cnblogs.com/ahfuzhang/p/10843181.html

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfkice
系列文章
更多 icon
同类精品
更多 icon
继续加载