静态库相比动态库更加独立,在生成和部署应用到相关设备的时候避免找不到动态库
Windows下静态库 lib后缀,动态库dll
linux下静态库a后缀,动态库so
首先安装依赖库
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
在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静态库呢?
答案是需要。
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静态库编译与链接
在编译静态库,链接静态库,和使用静态库的过程中,可能会遇到找不到相关符号的情况
解决办法
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