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

这篇具有很好参考价值的文章主要介绍了Opencv静态库,编译和调用静态库,静态库链接另一个静态库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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源码
解压后目录如下
Opencv静态库,编译和调用静态库,静态库链接另一个静态库

进入源码

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文件夹
Opencv静态库,编译和调用静态库,静态库链接另一个静态库
lib下含有生成的静态库
Opencv静态库,编译和调用静态库,静态库链接另一个静态库

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文章来源地址https://www.toymoban.com/news/detail-470397.html

到了这里,关于Opencv静态库,编译和调用静态库,静态库链接另一个静态库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux gcc/g++编译链接头文件和库(动态库.so 和 静态库.a)

    最近在学习log4cpp库时,使用g++去编译,却发现自己不会链接...,这哪能行,于是网上钻研,终于解决,现在记录下来分享给遇到同样问题的人。 gcc和g++类似,这里就以g++为例! 刚好用到的log4cpp日志库有头文件和动态库.so和静态库.a,这里就以log4cpp库为例。 在安装好log4cpp库

    2024年02月08日
    浏览(41)
  • Linux编译链接选项静态库--whole-archive,--no-whole-archive

    在使用cmake构建工程时,目标可执行程序可以正常构建,但是运行不符合预期。可执行程序依赖libtool.a静态库,静态库有个全局map,map中存放注册的回调函数。在可执行程序运行时发现map为空,检查代码逻辑,libtool.a中存在注册行为。 1、通过nm定位出相关符号表在libtool.a中存

    2024年02月07日
    浏览(27)
  • 编写c语言程序调用openssl编译出的动态链接库

    下载安装openssl并编译生成链接库的过程在我的另一篇文章中已经详细说明了:Ubuntu中安装OpenSSL 此外,我们还需要提前了解一些关于动态链接库的知识,具体内容可以在我的这篇文章中查看:一个简单的动态链接库示例 要调用OpenSSL库中的函数,需要在对应的C源文件中包含相

    2024年02月11日
    浏览(46)
  • C++编译静态成员函数报错: “osgGA::DriveManipulator::setEye”: 非静态成员函数的非法调用

    来看代码 但是会报错,说引用错误。 这是因为把computePosition函数定义为 static 引起的。 解决办法: computePosition函数定义为 static 不能更改了(我的代码需求,static必须存在),所以要在它内部使用,需要把其它函数也改成静态的。 更改如下: 关于.cpp文件那两行应该放在哪

    2024年02月09日
    浏览(38)
  • Opencv 源码编译以及调用相关

    源码下载, 注意其中的 batch , 选择一致。 安装依赖 比较简单的编译选项 关于其中的 -j 选项说明 选定视频编解码框架编译到opencv中 安装gstreamer 安装ffmpeg 编译配置 https://github.com/opencv/opencv/issues/22132

    2024年02月11日
    浏览(30)
  • ubuntu 20.04 aarch64 平台交叉编译 opencv 静态库

    win10 64 位 VMware Workstation Pro 16 虚拟机 虚拟机安装 ubuntu 20.04 opencv 版本: 来自 github 当前最新 4.7 交叉编译 opencv 生成静态库(.a),用于 嵌入式 aarch64 平台。 参考上一篇 ubuntu 20.04 aarch64 平台交叉编译 opencv 默认会生成 动态库(so),可以通过cmake 配置 -DBUILD_SHARED_LIBS=OFF 关闭动

    2024年02月08日
    浏览(53)
  • 从头开发一个RISC-V的操作系统(三)编译与链接

    目标:通过这一个系列课程的学习,开发出一个简易的在RISC-V指令集架构上运行的操作系统。 这个系列的大部分文章和知识来自于:[完结] 循序渐进,学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春,以及相关的github地址。 在这个过程中,这个系列相当于是我的学习笔记,做

    2024年04月09日
    浏览(40)
  • 【已解决】Ubuntu 20.04 编译OpenCV 动态链接库指向版本不一致导致出错

    问题:编译OpenCV 4.8.1, 显示出错: /usr/bin/ld: /lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to `ffi_type_uint32@LIBFFI_BASE_7.0\\\' /usr/bin/ld: /lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to `ffi_type_sint32@LIBFFI_BASE_7.0\\\' /usr/bin/ld: /lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to

    2024年02月04日
    浏览(30)
  • 详述C++ 调用opencv编译成dll并调用的全过程

     其中,extern \\\"C\\\":告诉编译器将被它修饰的代码按C语言的方式进行编译。             __declspec(dllexport):告诉编译器和链接器被它修饰的函数或变量需要从DLL导出,以供其他应用程序使用;与其相对的还有一句代码是__declspec(dllimport),此修饰符的作用是告诉编译器和链接

    2024年02月04日
    浏览(45)
  • Ubuntu【系统环境下】【编译安装OpenCV】【C++调用系统opencv库】

    本人需要用C++写代码,调用OpenCV库,且要求OpenCV版本号大于4.1.0 由于使用的是18.04的版本,所以apt安装OpenCV的版本始终是3.2.0,非常拉胯!!! 所以只能重新编译安装OpenCV 查看当前C++调用的OpenCV代码 apt 安装 OpenCV sudo apt install libopencv-dev apt 安装 OpenCV 并与系统python环境关联

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包