cmake静态编译以及安装带有opencv的静态库并调用
搞opencv的静态编译
- 静态编译就是说可以将你编译出来的可执行文件放到没有配置什么环境的电脑里,直接运行;
- 而动态编译则需要将用到的库文件放到相应位置,windows下将需要的库文件放到根目录即可,linux则需要放到系统路径中。
首先明确一点:想做自己写的程序的静态编译,例如写一个关于opencv的代码,首先需要将opencv库进行静态编译,网上有各种教程。windows上将opencv源码进行静态编译,然后通过对vs进行相应的简单配置,就可以生成静态编译的可执行文件。
linux上将opencv源码进行静态编译,注意一点:用cmake进行生成的时候,将CMAKE_INSTALL_PREFIX这个变量的值不要改动!默认为/usr/local!!!(血的教训)然后将其中的SHARE(动态编译)关掉。这样就可以进行生成编译了。
在执行自己cpp文件静态编译的时候,出现了很多的错误(捣鼓了很多天。。。都是泪)
CMakeLists的书写不难,只要将target_link_libraries()里面link你编译出来的opencv静态库就好了(不需要find_package)。但是会出现以下几类错误:通过笔者经历九九八十一难(可能是我太笨了。。。),我终于找到了解决方法:解决方式都一样,在target_link_libraries()里面最后添加相应的参数就好啦!!!
1 .未定义符号'pthread_key_delete
TARGET_LINK_LIBRARIES(... -lpthread -lm)
2.对_gzopen等的未定义引用(Undefined reference to _gzopen etc)
TARGET_LINK_LIBRARIES(... -lz)
3.对‘dlopen’未定义的引用
TARGET_LINK_LIBRARIES(... -ldl)
4.undefined reference to 'cv::String::deallocate()'
undefined reference to 'cv::String::allocate(unsigned long)'
将
find_package( OpenCV REQUIRED )
更改为
find_package( OpenCV 3 REQUIRED )
5.注意变量的大小写!
target_link_libraries( main ${OPenCV_LIBS})
变量大小写错,改为:
target_link_libraries( main ${OpenCV_LIBS})
终于没有那么多错误啦,静态编译成功啦!!!感恩!
笔者又想建立自己的静态库,并调用自己的静态库和opencv静态库
构建自己的静态库参考https://blog.csdn.net/Jeffxu_lib/article/details/85874144结果出现了链接问题。
解决了出现的问题后,得到的结论如下:
1. 自己的静态库无论调用其他的动态库还是静态库,只需要在源文件中include库的头文件就OK了
2. 要在调用该静态库的地方添加库引用,并设置路径。(若安装在/usr/local下,貌似可以不用添加路径也可以)
结论:其实静态库调用动态库或者静态库,只是在用到库方法的地方把该方法添加到LIB当中,真正使用的地方才会把这些库LINK起来生成可执行文件。(摘自:https://blog.csdn.net/wangjunhe/article/details/6690795?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase)
3,链接库具有依赖顺序,在link的时候必须按照顺序来写,要求被依赖的库放在依赖它的库后面,否则会出现“未定义的引用”的问题。
cmake中链接库的顺序是a依赖b,那么b放在a的后面。
例如进程test依赖a库,b库, a库又依赖b 库,那么顺序如下:
target_link_libraries(test a b)
上面的a,b的顺序不能变,只能按上面的先后顺序。如果去掉顺序的烦恼和痛苦,可以采用如下的写法:
target_link_libraries( test -Wl,--start-group b a -Wl,--end-group)
4,如何让有些“-l”链接静态库,而另一些链接共享库?
用“-Wl,-Bstatic
”指定链接静态库,使用“-Wl,-Bdynamic
”指定链接共享库,使用示例:
-Wl,-Bstatic -lmysqlclient_r -lssl -lcrypto -Wl,-Bdynamic -lrt -Wl,-Bdynamic -pthread -Wl,-Bstatic -lgtest
"-Wl"表示是传递给链接器ld的参数,而不是编译器gcc/g++的参数。
小白加油!只要不放弃,一定能成功!
cmake静态编译以及安装带有opencv的静态库并调用相关推荐
- linux pcre静态编译,Linux下,Nginx部署静态网站
1.准备工作 选首先安装这几个软件:GCC,PCRE(Perl Compatible Regular Expression),zlib,OpenSSL. Nginx是C写的,需要用GCC编译:Ngin ...
- Qt最新版5.14在Windows环境静态编译安装和部署的完整过程 VS 2019-Qt static link build Windows 32 bit/64 bit
文章目录 为什么要静态编译(static link) 1.源码下载/source code download 2. 编译工具下载/compiler download 编译环境选择:MinGW/MSVC ...
- Qt最新版5.13在Windows环境静态编译安装和部署的完整过程(VS 2017/VS 2019)
文章目录 为什么要静态编译 1.源码下载 2. 编译工具下载 ActivePerl Python Ruby 编译环境选择 3.编译 1.修改源码里的qtbase\mkspecs\common\msvc ...
- Qt最新版5.12在Windows环境静态编译安装和部署的完整过程(VS2017)
文章目录 为什么要静态编译 1.源码下载 2. 编译工具下载 ActivePerl Python Ruby 编译环境选择 3.编译 1.修改源码里的qtbase\mkspecs\common\msvc ...
- CentOS编译安装Qt(Qt可使用静态编译编译器)
CentOS编译安装Qt(Qt可使用静态编译编译器) 文章目录 前言 下载Qt源码 编译安装--以4.7.4为例 安装QtCreator 设置编译器 附加--Windows Qt静态编译的方法(以5. ...
- Qt 静态编译(5.15.2 MinGW 32-bit)
Qt 静态编译(5.15.2 MinGW 32-bit) 文章目录 Qt 静态编译(5.15.2 MinGW 32-bit) 摘要 1 编译前准备 1.1 编译环境准备 系统环境 Qt 版本 gcc ...
- Linux环境下源码编译方式安装MySQL5.1(1)
1.源码安装MySQL 5.1 GA 创建组和用户: [root@mysqldb2 ~]# groupadd mysql [root@mysqldb2 ~]# useradd -g mysql mys ...
- qt 静态编译 -- 生成exe单文件 别的电脑可以直接用
qt 静态编译 收集 https://github.com/last2win/qt-5.13 Qt最新版5.13在Windows环境VS 2017 64位静态编译完成的结果 此仓库很大,建议直接下载压 ...
- 拿来主义——QT静态编译配置
如何快速完成QT静态编译的配置(windows)↓↓↓ 0.写在前面 1.下载原版QT 2.开始"拿来"--下载别人编译好的 2.1检查自己的QT路径 2.2下载已经编译好的QT ...
- 编译linux tq2440,QT4.8.2在TQ2440开发板上的移植(一)--编译和安装
主机版本:Ubuntu 11.04 交叉编译器版本:4.3.3 移植的主要工作就是编译在ARM板上运行的qt库,并且把这些库做到根目录中.需要的文件tslib-1.4.tar.gz qt-everyw ...
最新文章
- 模板 - 数学 - 数论 - 莫比乌斯反演 - 2
- JS报错:require is not defined
- 微软在Skype推出LGBT骄傲月表情与贴纸
- ajax 设置Access-Control-Allow-Origin实现跨域访问
- FastDFS:Java客户都实现文件的上传、下载、修改、删除
- 宝塔清mysql主从日志_宝塔面板Mysql主从日志文件mysql-bin文件清除方法
- AspNetCore在docker部署时遇到一个小坑
- 使用文本编辑器和jdk_JDK 14:记录,文本块等
- Python高级——数据库编程(Mysql)
- form表单重复提交
- eclipse常见小问题
- http接口_基于Python的HTTP接口自动化测试框架实现
- 配置WindowsLiveWriter,写cnblogs博客
- 2021-08-10 C3P0连接池
- Ubuntu 定时锁屏3.0
- java 计算间隔天数,java 计算间隔的天数
- 计算机英语作文50词左右带翻译,找十篇英语作文,带翻译,50个词
- android recovery 机器人,扫盲贴:关于recovery模式的机器人倒地和感叹号
- 使用Okhttp调用聚合API
- java实现PDF转图片功能,附实例源码!