OpenCV 静态链接 libstdc++
为了让依赖于opencv编译出的so库带有尽量少的依赖, 我们需要将opencv编译成静态库(.a), 比如用下面的命令使用cmake:
mkdir build
cd build
cmake -D WITH_IPP=OFF -D CMAKE_BUILD_TYPE=RELEASE -D BUILD_SHARED_LIBS=OFF ..
make -j4
sudo make install
但此时的问题是, 这样虽然去掉了opencv相关动态so库的依赖, 但依赖这个opencv静态库编译出的so仍然带有glibc的强依赖, 比如ldd xxx.so
得到结果:
linux-vdso.so.1 => (0x00007ffefcd33000)libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f390b6d2000)libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f390b4bc000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f390b0f1000)libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f390aed4000)libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f390abcb000)libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f390a9c6000)librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f390a7be000)/lib64/ld-linux-x86-64.so.2 (0x0000560df4951000)libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f3909428000)
注意libstdc++.so.6, 和 libgcc_s.so.1, 我们需要去掉这两项的依赖.
经过多种尝试, 发现, opencv编译好之后, 别的项目中引用opencv, 会引用opencv的相关配置, 而opencv的相关配置中, 带有 -lstdc++
, 这样, 总会带有stdc++的动态依赖. 我的办法是安装好opencv之后, 直接修改opencv安装完成之后的配置文件.
我们可以这样找:
grep -ir "stdc++" /usr/local/share
在我的release安装中, 应当修改:
sudo vi /usr/local/share/OpenCV/OpenCVModules-release.cmake
比如可以看到一系列类似如下的行:
IMPORTED_LINK_INTERFACE_LIBRARIES_RELEASE "opencv_core;opencv_imgproc;stdc++;dl;m;pthread;rt"
把这个文件中所有的stdc++
改为-static-libstdc++
即可.
然后我们编译自己的不管是so库也好, 可执行文件也好, ldd之后结果为:
linux-vdso.so.1 => (0x00007ffec0fc6000)libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fb6f47f9000)libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb6f45f5000)libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb6f43d7000)librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb6f41cf000)libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb6f3ec6000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb6f3afb000)/lib64/ld-linux-x86-64.so.2 (0x000055f9e5f86000)
这样, 就去掉了上述两个强依赖的so库. 在linux机器之间拷贝也就少了很多依赖麻烦.
这里zlib仍然是动态链接的, 如果有时间还可以把zlib的依赖也去掉.
OpenCV 静态链接 libstdc++相关推荐
- mingw编译opencv动态链接库和静态链接库及使用方法
前言 我一直不知道编译的过程以及cmake, make 这些工具是干什么的,所有抽时间研究了一下. 简单来说就是 cmake 是根据 CMakeLists.txt 用来生成 makefile文件的.而 ...
- 静态链接库和动态链接库(转)
我们可以创建一种文件里面包含了很多函数和变量的目标代码,链接的时候只要把这个文件指示给链接程序就自动地从文件中查找符合要求的函数和变量进行链接,整个查找过程根本不需要我们操心. 这个文件叫做 &quo ...
- VS2013创建opencv-2.4.10静态链接库
如何在VS2013下配置OpenCV VS2013+opencv2.4.10配置 vs2013配置opencv VS2013怎么配置opencv才能不用每次都重新配置一遍 我们平时在VS2013 ...
- GCC 编译 C(C++)静态链接库(gcc -L、gcc -l)和动态链接库(gcc -fPIC -shared)的创建和使用
1. 库文件 所谓库文件,读者可以将其等价为压缩包文件,该文件内部通常包含不止一个目标文件(也就是二进制文件). 值得一提的是,库文件中每个目标文件存储的代码,并非完整的程序,而是一个个实用的功能模块 ...
- Linux下Makefile中动态链接库和静态链接库的生成与调用
背景:写这篇博客的原因是:最近在搞嵌入式,需要交叉编译opencv库文件,自己写Makefile,通过arm-linux-g++编译.链接.生成可执行文件,从而实现了移植的过程.平台是Toradex的 ...
- linux 静态链接 mysql glibc 库的悲催过程 - mango的日志 - 网易博客
linux 静态链接 mysql glibc 库的悲催过程 - mango的日志 - 网易博客 linux 静态链接 mysql glibc 库的悲催过程 - mango的日志 - 网易博客 linu ...
- linux 静态链接 mysql glibc 库的悲催过程
这两天需要把项目做成静态链接版本,便于在各公司的各种linux平台上运行. 我想这还不简单,链接参数加一个-static不就行了,但接下来解决一系列问题的时间远远超出我的意料 开发环境: CentOS ...
- android 静态链接libc,静态链接任何库会导致libc无法链接
我的系统是运行2.6.32的旧NAS . 我发现当对任何后续库使用-static时,它也会尝试静态链接我可能需要的任何其他库 . 当我首先添加-Wl,-Bdynamic标志然后使用-lc显式命名这些库 ...
- Linux gcc 制作动/静态链接库
gcc 静态链接库 以 math.c为例 gcc -c math.c ar rcs libmath.a math.o ar命令 将多个文件打包成一个备份文件 参数r:用来替换库中已有的目标文件,或加入 ...
最新文章
- 中介分析 相对直接效应 相对简介效应_中介效应分析方法和流程
- sdut 数据结构实验之二叉树六:哈夫曼编码
- 百度SEO站长统计后台广告推送引流软件
- 【逆序对相关/数学】【P1966】【NOIP2013D1T2】 火柴排队
- MyBatis映射器出错,已解决(Multiple annotations found at this line:)
- Datawhale 零基础入门数据挖掘-Task2 数据分析
- Android studio jni
- 【转载】在使用上perror和strerror应注意的地方
- C专家编程 第1章 C:穿越时空的迷雾 1.1 C语言的史前阶段
- 传染病模型SIS及相应的matlab代码
- RC523读身份证ID
- QT 黑色风格+白色风格+淡蓝色风格样式表。
- 外国人申请在中国永久居留服务指南(中英文)
- linux主板上的网卡不显示,redhat4.8在MSI主板安装完识别不到网卡RTL8168
- 从0开始搭建Hadoop2.x高可用集群(HDFS篇)
- python opencv选取特定颜色区域
- 脚本录制和回放终端会话(script、scriptreplay)使用
- linux远程开机wol,Wol在线远程开机、唤醒工具使用说明
- 无代码五月大事件|微软低代码矩阵更新;多份行业报告发布...
- 函数调用matlab,Matlab中一个函数调用另外一个函数的操作方法