qt-4.6.0可为是比较老的版本了,在新版的ubuntu上编译可为是困难重重,但在嵌入式开发和软件移植中依然起着桥梁作用,以此文章总结一下编译时遇到的困难。
编译环境:
qt-everywhere-opensource-src-4.6.0.tar.gz (可以在qt ftp上下载)
g++-4.4;gcc-4.4
openssl-0.9.8q
libx11;libfreetype6;libavahi-gobject;libsm;libxrender;libfontconfig;libxext (可以通过apt-get install获得)
编译过程:
ubuntu12.04版本中默认的g++版本是4.6,但4.6版本的g++,gcc无法编译。在编译时不会报错,但在连接qt库时会无法应用。所以要安装最适合编译qt各种版本的g++-4.4和gcc-4.4。安装完后查看g++目录(gcc方法相同)。
ls /usr/bin/g++* -l //查看g++目录,发现默认g++ ->g++-4.6
sudo rm /usr/bin/g++ //删除软连接
sudo ln -s /usr/bin/g++ /usr/bin/g++ //从新建立连接
g++ -v
设置gcc-4.4的方法同上。
Openssl的安装比较麻烦,可以用新立得,删除自带的Openssl-1.0.1,下载openssl-9.8.0q的源码http://ftp.openssl.org/source/openssl-0.9.8q.tar.gz 为什要用低版本的openssl,原因在于高版本的openssl修改了很多关于ssl的部分,会导致编译出错。
编译源码
tar -zxf openssl-0.9.8q.tar.gz
cd openssl-0.9.8q/
./config --prefix=/usr/local --openssldir=/usr/local/ssl
make && make install
./config shared --prefix=/usr/local --openssldir=/usr/local/ssl
make clean
make && make install
两次编译生成动态连接库。解决了无法找到opensslv.h
这时候我们要对qt的源码进行修改主要是针对SSLV2错误的处理。由于SSLV2已经很少使用,在这里我们采用直接注释掉代码的方法。打开qt的源码目录../qt-everywhere-opensource-src-4.6.0/src\network\ssl。找到qsslsocket_openssl_symbols.cpp和qsslsocket_openssl_symbols_p.h打开,将其中的存在参数SSLv2_client_method和SSLv2_server_method所在的所有行,将其整行注释掉。这样就解决了编译时出现的
undefined reference to SSLv2_server_method
undefined reference to SSLv2_client_method
编译qt
./configure -xxxx //xxxx为不需要的模块或连接动态连接库
make
sudo make install
这样编译就差不多完成了。但还没有加入环境变量在qt目录下
export QTDIR=/usr/local/Trolltech/Qt-4.6.0
export PATH=$QTDIR/bin:$PATH
export QMAKESPEC=$QTDIR/mkspecs/default
这样算是大功告成了,编译qt make时间很长,大概1h-2h,要看./configure的模块而定