环境:ubuntu16.04 32位+Qt5.5.1+opencv2.4.9
用Qt和opencv编写的程序在Linux下编译打包非常麻烦,特别是静态编译,捣鼓了好几天,有必要记录一下。
关于静态与动态链接
在编译时期(compile time)把相关对象文件与函数库链接成可执行文件,叫静态链接(static link),而用到的函数库叫静态库(static library),Linux下文件名为“libxxx.a”的形式。
在程序运行时期(runtime)再链接组成程序的目标文件就叫做动态链接(dynamic linking),这些目标文件称为动态链接库(dynamic link library,DLL)。Linux下是共享库(Shared Library),文件名为“libxxx.so”的形式。
Qt和opencv默认采取动态链接的方式。
动态链接文件
程序运行需要链接动态库时,编译器会到特定的路径查找库文件,默认路径是:/lib和/usr/lib,可通过一下方式添加路径:
1.修改配置文件/etc/ld.so.conf,直接在文件中添加路径,运行ldconfig。
2.添加环境变量LD_LIBRARY_PATH。
3.编译时直接指定文件。
Makefile参数
INCPATH是指头文件目录,-I也是这个意思。LIBS是指库文件,-L也是这个意思。其中如-ljasper这种参数,-l省略了开头的lib和结尾的.a或.so,即代表了libjasper.so,但不用写路径,而且编译器会自动找库文件(可能不只一个版本)。
静态编译程序
1、编译QT静态库
首先需要下载Qt源码:
qt-everywhere-5.5.1
其他版本也能在上面找到,注意要下载everywhere版本的。
解压,在目录下执行命令:
./configure -static -release -qt-zlib -qt-libpng -fontconfig -qt-xcb -skip qtwebkit -skip qt3d -qt-freetype -qt-libjpeg -nomake examples -qt-sql-sqlite -nomake tests -silent -c++11 -no-qml-debug -prefix /opt/Qt-5.5.1-static
注意与动态版本区分,要根据需要选择相应参数,减少编译部分组件(但某些很重要,不能少),能有效提高编译速度,不清楚可以执行:
./configure -help