现在的位置: 首页 > 综合 > 正文

LINUX下安装QT的惨痛经历

2012年10月28日 ⁄ 综合 ⁄ 共 26121字 ⁄ 字号 评论关闭

安装QT的惨痛经历
目标:2012.4月下旬,计划开始在linux上安装QT和ffmpeg,准备摸索一下视频客户端的开发。

----------------------------------------------------以下是安装过程----------------------------------------------------
由于没有额外的电脑,所以使用了虚拟机安装。
电脑上刚好有fedora6版本的linux,于是安装。在安装过程中选择了开发工具。
安装完成,从官网下载最新的qt4.8.0,拷贝到一个目录中然后解压。
进入目录后:./configure,选择开源“o”,并接受协议“yes”,2小时后,提示失败。找不到解决办法,后听说一般都用红帽企业版,后找来企业版5.5安装。
安装完成,然后把原始的qt卸载,计划安装新版本。结果无法安装,痛苦。由于原先的QT被卸载,所以又只好重装同一系统。
完成后不再卸载原始的qt,但是无qtcreator,随后在nokia官网下载qtcreator成功,然后安装成功。但是无法启动,双击时无任何反应,汗。
安装qtsdk,先:./configure,结果提示总线错误
安装ffmpeg,先:./configure,结果提示总线错误
又上nokia官网下载qtlib,结果下载下来的是qt4.8.1(文件名QtSdk-offline-linux-x86-v1.2.1.run,为方便,后面以<sdk>表示之),按照说明,先修改文件的执行模式:chmod u+x <sdk>,成功,然后安装:./<sdk>,仍然是错误:

/root/Desktop/vmtool/QtSdk-offline-linux-x86-v1.2.1.run: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by /root/Desktop/vmtool/QtSdk-offline-linux-x86-v1.2.1.run)
/root/Desktop/vmtool/QtSdk-offline-linux-x86-v1.2.1.run: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by /root/Desktop/vmtool/QtSdk-offline-linux-x86-v1.2.1.run)
/root/Desktop/vmtool/QtSdk-offline-linux-x86-v1.2.1.run: /lib/libc.so.6: version `GLIBC_2.9' not found (required by /root/Desktop/vmtool/QtSdk-offline-linux-x86-v1.2.1.run)
/root/Desktop/vmtool/QtSdk-offline-linux-x86-v1.2.1.run: /lib/libc.so.6: version `GLIBC_2.10' not found (required by /root/Desktop/vmtool/QtSdk-offline-linux-x86-v1.2.1.run)
/root/Desktop/vmtool/QtSdk-offline-linux-x86-v1.2.1.run: /lib/libc.so.6: version `GLIBC_2.11' not found (required by /root/Desktop/vmtool/QtSdk-offline-linux-x86-v1.2.1.run)
/root/Desktop/vmtool/QtSdk-offline-linux-x86-v1.2.1.run: /lib/libc.so.6: version `GLIBC_2.7' not found (required by /root/Desktop/vmtool/QtSdk-offline-linux-x86-v1.2.1.run)

上网上搜索,说需要libstdc++.so.6.0.10,然后下载之,放入/usr/lib/中,并修改libstdc++.so.6的链接为此文件,然后继续安装,此报另外的错误(内容没有记下来),此时原来的文本文件编辑器gedit无法启动,直接崩溃。然后换回libstdc++.so.6的链接文件为原来的libstdc++.so.6.0.8,无解。

再仔细看nokia网站说明,似乎没有说支持企业版linux,而是支持ubuntu。
然后下载ubuntu11.10的桌面版(基本上是最新的了),32位的。安装,过程中不能选择开发工具,但是等了好久,终于安装完成。
查看,结果无qt,只好重新安装。这次直接安装qt4.8.1(qt-everywhere-opensource-src-4.8.1),解压,进入目录:
./configure
结果提示无g++,晕,明显是安装了gcc,竟然没有g++!
后上网搜索g++,但似乎是集成在gcc里的,所以到官网http://gcc.gnu.org/下载gcc最新版本4.7.0,这里有很多镜像站点,我从加拿大的一个站点上下载,速度相当快,总大小有101MB。
下载完成,放进虚拟机,拷贝到一个目录中,然后解压,进入目录,运行如下命令(只有2个目录3个文件):
./install-sh
结果提示错误,我晕啊。
查看拷贝进来的压缩文件,只有183KB,而原始的是101MB,后重新拷贝,原来是上次没有拷贝完,但不知原因。解压后,目录里有很多文件夹和文件,这次正常了,再次进入,运行命令:
./configure
数分钟后,提示:

checking for objdir... .libs
checking for the correct version of gmp.h... no
configure: error: Building GCC requires GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0+.
Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify
their locations.  Source code for these libraries can be found at
their respective hosting sites as well as at
ftp://gcc.gnu.org/pub/gcc/infrastructure/.  See also
http://gcc.gnu.org/install/prerequisites.html for additional info.  If
you obtained GMP, MPFR and/or MPC from a vendor distribution package,
make sure that you have installed both the libraries and the header
files.  They may be located in separate packages.

汗,还需要另外的三个库!
上网搜索,结果在gcc官网的fpt站点上发现了它们,下载之,然后放入虚拟机中,拷贝到独立目录中,直接解压,然后进入gmp目录:
./configure
结果提示如下:

checking whether vsnprintf works... yes
checking whether sscanf needs writable input... no
checking for struct pst_processor.psp_iticksperclktick... no
checking for suitable m4... configure: error: No usable m4 in $PATH or /usr/5bin (see config.log for reasons).

没有m4(m4是什么东东?一头雾水),不管,进入mpc:
./configure
结果提示另外一个错误(没有记录下来),my god,要死人了,也不管,进入mpfr目录,然后:
./configure
结果提示内容和gmp一样,放我一条生路吧$#@@!!

继续上网搜索m4,发现这是一个库,下载最新版本,然后解压再安装:
./configure
make
make install
非常顺利,成功!除了qtctreator一次性成功之外,这个是第二次了,爽。
回过头安装gmp:
./configure
成功,再
make
也成功,继续
make install
又成功了,顺利啊,再安装mpc:
./confgiure
结果提示和上次一样,是有mpfr有关的,所以就先安装mpfr,成功,再安装mpc,也成功。松了口气。
安装gcc4.7.0:
./configure
结果错误还是一样,需要那3个库。晕,版本不对也不行啊,关键是有的库不好找,本来不想找,但现在看来不找还是不行,找就找了,终于找到了,下载地址:

mpfr,mpc:http://www.multiprecision.org/
mpfr:http://mpfr.loria.fr/mpfr-2.3.1/
gmp:http://gmplib.org/

这次一定要下载对应的版本了,下载结束再安装(无需再安装m4了,之前安装好的),仍然按照正确的顺序:先gmp,再mpfr,最后mpc,顺利,又成功了。
再安装gcc4.7.0:
./configure
几秒钟后结束,没有报错,心有喜。继续:
make
满屏飞滚字母,这下有好戏看了,一边写这个文章,一边让它在那里滚吧。
几十分钟过去了,它停住了!提示如下:

checking for i686-pc-linux-gnu-gcc... /home/ligo/qttools/gcc-4.7.0/host-i686-pc-linux-gnu/gcc/xgcc -B/home/ligo/qttools/gcc-4.7.0/host-i686-pc-linux-gnu/gcc/ -B/usr/local/i686-pc-linux-gnu/bin/ -B/usr/local/i686-pc-linux-gnu/lib/ -isystem /usr/local/i686-pc-linux-gnu/include
-isystem /usr/local/i686-pc-linux-gnu/sys-include  
checking for suffix of object files... configure: error: in `/home/ligo/qttools/gcc-4.7.0/i686-pc-linux-gnu/libgcc':
configure: error: cannot compute suffix of object files: cannot compile
See `config.log' for more details.
make[2]: *** [configure-stage1-target-libgcc] 错误 1
make[2]:正在离开目录 `/home/ligo/qttools/gcc-4.7.0'
make[1]: *** [stage1-bubble] 错误 2
make[1]:正在离开目录 `/home/ligo/qttools/gcc-4.7.0'
make: *** [all] 错误 2

上网上搜索到几个网址:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40360
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35693
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35577
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36248
说的问题都很相似,但可能不是同一个版本。大致看了一下,有可能是mpfr库的路径造成的问题,于是想按照示例指定mpfr的路径,在终端上的查看mpfr的路径:
whereis mpfr
结果显示为空!竟然没有安装成功?但是安装的过程中没有看到有错误产生。
为了再看一遍是否成功,对mpfr重新安装了一遍,在make install结束后,离打印结束的位置很近的地方有如下提示:

----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

先不管,再:
whereis mpfr
结果还是显示为空,直接打开 /usr/local/lib,还是可以看见有mpfr库的:libmpfr.a、libmpfr.la、libmpfr.so.1.1.1、libmpfr.so.1.2.2,还有两个链接文件:libmpfr.so、libmpfr.so.1。
指定路径的例子如下:
../gcc-4.3.0/configure --with-gmp=/apps/gmp/4.2.2
--with-mpfr=/apps/mpfr/2.3.0 --prefix=/apps/gcc/4.2.2
--enable-languages=c,c++,fortran,java,objc,obj-c++,treelang

重新进入gcc4.7.0目录:
./configure --with-mpfr=/usr/local/lib
几秒钟就结束了,没有发现错误。继续:
make
结果错误依旧。
继续上网搜索,请参考网址:http://hi.baidu.com/jrckkyy/blog/item/f3427f11729e9200b8127b6d.html

需要安装gmp与mpfr
并且需要在.bash_profile(一般在/root目录下)配置LD_LIBRARY_PATH,把GMP与MPFR对应的lib配置上
如:LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpfr/2.4.0/lib:/usr/local/gmp/4.2.2/libexport LD_LIBRARY_PATH
一定要重启生效或者使用 source /root/.bash_profile

但我不是root用户,无法进入这个目录,晕,root用户还没有开启,还得找方法。哎,惨痛啊,今天都5.4号了,1周多了,这环境还没有搞定,看来搞linux有饭吃,服务就能赚钱了。
由于无法直接修改.bash_profile文件,所以就直接在命令行下胡乱试一下:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
然后再make,结果错误一样。
继续搜索,找到了
http://topic.csdn.net/u/20110826/21/dd903bec-c852-4d7e-a5b1-05710c3804ee.html
,问题是一样的,只是版本不一样,但是没有结果,再搜,又搜到一篇,http://www.cnblogs.com/shawn-zhou/archive/2009/08/06/1540624.html

configure: error: cannot compute suffix of object files: cannot compile gcc
    Configure file can't find mpfr libs
export LD_LIBRARY_PATH=/usr/local/lib (if your mpfr is intalled in it)

按照它,我输入:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
然后再make,结果又错了,但信息不一样:

In file included from /usr/include/stdio.h:28:0,
                 from ../.././libgcc/../gcc/tsystem.h:88,
                 from ../.././libgcc/libgcc2.c:29:
/usr/include/features.h:323:26: fatal error: bits/predefs.h:没有那个文件或目录
compilation terminated.
make[3]: *** [_muldi3.o] 错误 1
make[3]:正在离开目录 `/home/ligo/qttools/gcc-4.7.0/i686-pc-linux-gnu/libgcc'
make[2]: *** [all-stage1-target-libgcc] 错误 2
make[2]:正在离开目录 `/home/ligo/qttools/gcc-4.7.0'
make[1]: *** [stage1-bubble] 错误 2
make[1]:正在离开目录 `/home/ligo/qttools/gcc-4.7.0'
make: *** [all] 错误 2

网上也找不到什么解决方法,我以为是自己可能把LD_LIBRARY_PATH变量给改坏了,用set看了一下,其值为:
/usr/local/lib,usr/local/lib
两个重复的没有啥特殊用途,于是重启虚拟机系统,再进入目录:
./configure
提示无权限,接着用
su
输入密码。这个用来提升权限,再
./configure
很快就成功,然后继续
make
结果又出错了:

/home/ligo/qttools/gcc-4.7.0/host-i686-pc-linux-gnu/gcc/cc1: error while loading shared libraries: libmpfr.so.1: cannot open shared object file: No such file or directory
make[3]: *** [_muldi3.o] 错误 1
make[3]:正在离开目录 `/home/ligo/qttools/gcc-4.7.0/i686-pc-linux-gnu/libgcc'
make[2]: *** [all-stage1-target-libgcc] 错误 2
make[2]:正在离开目录 `/home/ligo/qttools/gcc-4.7.0'
make[1]: *** [stage1-bubble] 错误 2
make[1]:正在离开目录 `/home/ligo/qttools/gcc-4.7.0'
make: *** [all] 错误 2

和之前不一样。似乎又是mpfr的问题,但是进入/usr/local/lib查看,libmpfr.so.1还是在的,而且其链接的那个文件也同样存在,怎么可能打不开呢?

5.07:
今天启动虚拟机,然后直接输入set查看LD_LIBRARY_PATH的值,结果不存在这个坏境变量,于是设置它:
export LD_LIBRARY_PATH=/usr/local/lib
然后再进入gcc-4.7.0目录:
./configure
成功,再
make
结果还是失败:/usr/include/features.h:323:26: fatal error: bits/predefs.h:没有那个文件或目录
看来一定要查看这个文件是什么了,网上搜索到

http://blog.sina.com.cn/s/blog_4e7453df01012r9d.html

解决方法:
确定你的系统是x86_64 GNU/Linux
       root@mm-desktop:/home/mm/android# uname -a
       Linux mm-desktop 2.6.27-9-generic #1 SMP Thu Nov 20 22:15:32 UTC 2008 x86_64 GNU/Linux
安装libc6-dev-i386
     sudo apt-get install libc6-dev-i386
    
不管了,直接输入命令看能否解决:
sudo apt-get install libc6-dev-i386
结果显示:末发现软件包libc6-dev-i386,没有办法,上网上又搜索到

http://www.cnblogs.com/superniaoren/archive/2012/3/23.html

编译过程中出错,报错是fatal error: bits/predefs.h:没有那个文件或目录compilation terminated. ,需要安装包
multilib,  命令为 $sudo apt-get install gcc-multilib

我在命令行中输入:
sudo apt-get install gcc-multilib
结果提示:

现在没有可用的软件包 gcc-multilib,但是它被其它的软件包引用了。
这可能意味着这个缺失的软件包可能已被废弃,
或者只能在其他发布源中找到
E: 软件包 gcc-multilib 没有可供安装的候选者

汗!~~~
现在重装ubuntu的服务器版!没有图像安装界面,我晕啊,没办法,只好重装桌面版。先安装vmware tools,结果提示权限不够,输入:
sudo passwd
然后再输入超级用户的密码,这样以后就可以用su来提权限了。输入su,再输入刚刚输入的密码,成功提升权限,安装vmware tools。

搜索 multilib,终于在 http://packages.ubuntu.com/ 找到了:gcc-multilib_4.5.2-1ubuntu3_i386.deb,但是只有不到1K的字节,直接拷贝到虚拟机里,才发现,不是安装包,只是安装包的下载种子,还得用软件中心打开它,然后再点“安装”让系统下载并安装它,日,我的电脑都不能上网啊,这。。。。,网上怎么也找不到可以直接安装的安装包,这下完了。
用软件中心打开,上面主要有三个信息:
1. 提示:依赖关系不满足:gcc-4.5-multilib(>=4.5.2-1~)
2. 有个可用的“安装”按钮
3. 最下面提示:您需要先安装这个软件才能评论
这三个信息说明了一个简单的问题,就是这个软件还没有安装,而且是可以安装的,但这显示和第一个有点矛盾。不管它,我直接点“安装”,半天过去了,没有任何反应。我下载它的网址是http://packages.ubuntu.com/,于是让网管开启了这个网址的权限,然后再点“安装”,结果仍然是半天没有反应,哎。。。。
按照这个网上的说法,建议使用安装包管理器来更新软件:

您可以使用以下列表中的任何一个源镜像只要往您的 /etc/apt/sources.list 文件中像下面这样添加一行:
deb http://ftp.de.debian.org/debian lenny main
请使用最终确定的源镜像替换 ftp.de.debian.org/debian

我这里用了 http://mirrors.163.com/ubuntu/ ,我把它添加到/etc/apt/sources.list的最后一行如下:
deb http://mirrors.163.com/ubuntu/ lenny main
保存,结果无法保存!不是以root用户登录,哎。我不想再说什么了。
注销,然后重新以root登录,这次可以修改了,然后再以软件中心打开gcc-multilib_4.5.2-1ubuntu3_i386.deb,结果提示“请通过正常的软件源安装“gcc-multilib”。请只有在信任该来源时才安装此文件。”,但是安装按钮仍然可用。直接按它,结果显示“正在安装...”,有点希望了。
不管咋样,几十分钟之后,有个提示“安装于2012年5月7日”,后面的按钮变成了“重新安装”,说明应该是安装成功了。
再继续安装gcc-4.7.0,由于刚才已经configure过了,这次就直接make,结果不一会儿就又有提示了:

In file included from /usr/include/features.h:388:0,
                 from /usr/include/stdio.h:28,
                 from ../.././libgcc/../gcc/tsystem.h:88,
                 from ../.././libgcc/libgcc2.c:29:
/usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h:没有那个文件或目录
compilation terminated.
make[3]: *** [_muldi3.o] 错误 1
make[3]:正在离开目录 `/home/ligo/qttools/gcc/gcc-4.7.0/i686-pc-linux-gnu/libgcc'
make[2]: *** [all-stage1-target-libgcc] 错误 2
make[2]:正在离开目录 `/home/ligo/qttools/gcc/gcc-4.7.0'
make[1]: *** [stage1-bubble] 错误 2
make[1]:正在离开目录 `/home/ligo/qttools/gcc/gcc-4.7.0'
make: *** [all] 错误 2

果然出现了在搜索其它问题时,也看到网上有说的问题,哎.....
搜索到 http://blog.chinaunix.net/uid-14753126-id-3148516.html,解决方法就是安装包,在命令行中输入:
apt-get install g++-multilib
然后询问是否安装,选择“Y”接受,开始下载。下载完后,很快就安装完成。为了保险,重新安装gcc:
./configure
没错,再
make
不一会儿又出错了,错误和上次一样!但那个安装,显然是已经成功了,这。。。。

5.08:
今天星期二了。
没辙了,就启动虚拟机瞎逛,不知不觉到了系统更新中,由于连网,所以看到了有几百个更新可用,大概看了一下,发现有些头文件可以更新,于是按照缺省的选择,又把去掉了一小部分绝对无用的更新,比如蓝牙、打印驱动什么的,然后开始更新,等了半天,终于更新完成,重启,再进到gcc目录,直接./configure,成功再make结果出现一样的错误。
进入/usr/include/gnu目录查看,里面有stubs.h和stubs-64.h文件,就是没有stubs-32.h文件。
自己在/usr/include下搜索,结果发现,在/usr/include/i386-linux-gnu/gnu中有这个文件(但没有64的那个,这个不用管),直接把它拷贝到/usr/include/gnu目录中,然后:
make
过了一会儿,出错:

/usr/bin/ld: cannot find crti.o: No such file or directory
collect2: error: ld returned 1 exit status
make[3]: *** [libgcc_s.so] 错误 1
make[3]:正在离开目录 `/home/ligo/qttools/gcc/gcc-4.7.0/i686-pc-linux-gnu/libgcc'
make[2]: *** [all-stage1-target-libgcc] 错误 2
make[2]:正在离开目录 `/home/ligo/qttools/gcc/gcc-4.7.0'
make[1]: *** [stage1-bubble] 错误 2
make[1]:正在离开目录 `/home/ligo/qttools/gcc/gcc-4.7.0'
make: *** [all] 错误 2

上网搜索,找到

http://hi.baidu.com/ch02221/blog/item/0a7368120cf73203dc5401e3.html(最后部分):

换装ubuntu64位系统后,升级到11.10后(经测试该方法也适用于12.04)编译程序又出现类似错误:
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
/usr/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status
解决办法:
export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
sudo ln -sf /lib/x86_64-linux-gnu/libgcc_s.so.1 /usr/lib/x86_64-linux-gnu/libgcc_s.so

之前用的是LD_LIBRARY_PATH,于是我猜这里写错了,就用了LD_LIBRARY_PATH,同时手动到目录/usr/lib/x86_64-linux-gnu目录查看,发现这个目录为空!汗!刚刚看头文件是/usr/include/i386-linux-gnu,所以又在/usr/lib中查找i386-linux-gnu,果然发现了这个目录,打开一看,里面的目录和文件真多,查找crti.o文件,果然发现在这里,于是:
export LD_LIBRARY_PATH=/usr/lib/i386-linux-gnu
再make,结果还是一样的错误,于是修改:
export LIBRARY_PATH=/usr/lib/i386-linux-gnu
再make,等,等,等,半个小时过去了,突然:

In file included from ../.././gcc/double-int.h:24:0,
                 from ../.././gcc/tree.h:31,
                 from ../.././gcc/c-lang.c:27:
/usr/local/include/gmp.h:515:12: error: ‘std::FILE’ has not been declared
make[3]: *** [c-lang.o] 错误 1
make[3]:正在离开目录 `/home/ligo/qttools/gcc/gcc-4.7.0/host-i686-pc-linux-gnu/gcc'
make[2]: *** [all-stage2-gcc] 错误 2
make[2]:正在离开目录 `/home/ligo/qttools/gcc/gcc-4.7.0'
make[1]: *** [stage2-bubble] 错误 2
make[1]:正在离开目录 `/home/ligo/qttools/gcc/gcc-4.7.0'
make: *** [all] 错误 2

操,又错了!
搜索到

http://groups.google.com/group/mozilla.dev.static-analysis/tree/browse_frm/month/2008-04/df617beb564fa9b7?rnum=11&_done=%2Fgroup%2Fmozilla.dev.static-analysis%2Fbrowse_frm%2Fmonth%2F2008-04%3F,有一段:

The only issue was the compiler error due to the
std::FILE in gmp.h header (4.2.1). That seems to be fixed with gmp
4.2.2. http://sagetrac.org/sage_trac/ticket/490.

这里不能用新版本,否则那gcc仍然编译不过,之前就已经说过了,而当前的这个版本有bug?无解。
又搜索到一个

http://groups.google.com/group/eql-user/browse_thread/thread/75c2ed7215fd19e4/94a770d0de4e8bce?lnk=raot

> I fixed this by adding #include <stdio.h> to some sourse and header
> files.
This seems to be the standard way of solving this problem.

不会是让我要修改头文件吧?打开 /usr/local/include/gmp.h,然后在开头处添加了一行:

#if defined (__cplusplus)
#include <iosfwd>   /* for std::istream, std::ostream, std::string */
#endif
#include <stdio.h> // 这一行是我添加的

然后再继续make,结果一样的错误!仿照之前的方法,从网上直接安装gcc:
sudo apt-get install gcc-4.7.0
结果提示没有这个软件包。
按照上面的方法,实际上是c-lang.c(位于gcc的安装目录中的gcc目录)包含tree.h,tree.h包含double-int.h,double-int.h包含gmp.h,所以在double-int.h包含gmp之前,添加了一行:

/* added by Ligo, 2012.05.08, for std::FILE has not been declared in gmp.h */
#include <stdio.h>

#ifndef GENERATOR_FILE
#include <gmp.h>
#endif
#include "coretypes.h"

然后再直接make。仍然是相同的错误,搜索到

http://gmplib.org/list-archives/gmp-bugs/2007-August/000820.html,有一段如下:

>  I think the correct way to fix is:
>
> #if defined (__cplusplus)
> extern "C" {
> #ifdef _GMP_H_HAVE_FILE
> using std::FILE;
> #endif
> #endif
>
>  But I am not a C++ expert.
>

在extern "C" {一行之后,添加了一个预定义条件,然后继续直接make(刚刚修改的double-int.h没有恢复)。等了至少1个多小时之后,终于结束而且没有报错~-~,然后
make install
大约10分钟,结束,而且成功~-~
然后拷贝qt-everywhere-opensource-src-4.8.1.tar.gz到一个目录中,解压,进入,然后:
./configure
结果失败:

Basic XLib functionality test failed!
 You might need to modify the include and library search paths by editing
 QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in /home/ligo/qttools/qt/qt-everywhere-opensource-src-4.8.1/mkspecs/linux-g++.

其中/home/ligo/qttools/qt是我拷贝到的路径。进入linux-g++目录(没有这个文件,而只有这个目录)里面有2个文件:qmake.conf、qmake.conf.h。.h文件里似乎没啥修改的,conf文件里似乎指定的是一些路径,内容不多,其中有三行如下:

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

其它似乎都没有包含有路径信息,先不管它,还是上网上搜索吧,发现大量相同内容的网址,比如http://www.linuxso.com/linuxrumen/19162.html,就按照上面的方法,直接安装3个库:
sudo apt-get install libX11-dev libXext-dev libXtst-dev
然后接受一些确认信息,大约十多分钟全部安装完毕。明天继续

5.09:
已经又周三了。上来不管三七21,直接进入目录,然后:
./configure
结果又出现了找不到crt1.o、crii.o文件的错误,看来LIBRARY_PATH在每次时候都需要重新设置,不会在安装成功之后也需要这样搞吧?怕怕地
经过大约半小时,结束,最后的提示如下:

Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into /usr/local/Trolltech/Qt-4.8.1

To reconfigure, run 'make confclean' and 'configure'.

终于有希望了。然后make。大约40分钟之后,一大堆错误出来了:

In file included from ../3rdparty/javascriptcore/JavaScriptCore/API/APICast.h:30:0,
                 from ../3rdparty/javascriptcore/JavaScriptCore/API/JSBase.cpp:30:
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h:62:65: 错误:expected class-name before ‘{’ token
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h: 在构造函数‘QTJSC::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData(QTJSC::JSGlobalObject::JSGlobalObjectData::Destructor)’中:
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h:71:19: 错误:类型‘QTJSC::JSVariableObject::JSVariableObjectData’不是‘QTJSC::JSGlobalObject::JSGlobalObjectData’的直接基类
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h: 在构造函数‘QTJSC::JSGlobalObject::JSGlobalObject()’中:
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h:166:124: 错误:对‘QTJSC::JSVariableObject::JSVariableObject(QTWTF::PassRefPtr<QTJSC::Structure>, QTJSC::JSGlobalObject::JSGlobalObjectData*)’的调用没有匹配的函数
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h:166:124: 附注:备选是:
In file included from ../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h:27:0,
                 from ../3rdparty/javascriptcore/JavaScriptCore/API/APICast.h:30,
                 from ../3rdparty/javascriptcore/JavaScriptCore/API/JSBase.cpp:30:
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSVariableObject.h:86:9: 附注:QTJSC::JSVariableObject::JSVariableObject(QTWTF::NonNullPassRefPtr<QTJSC::Structure>, QTJSC::JSVariableObject::JSVariableObjectData*)
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSVariableObject.h:86:9: 附注:  no known conversion for argument 2 from ‘QTJSC::JSGlobalObject::JSGlobalObjectData*’ to ‘QTJSC::JSVariableObject::JSVariableObjectData*’
In file included from ../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h:27:0,
                 from ../3rdparty/javascriptcore/JavaScriptCore/API/APICast.h:30,
                 from ../3rdparty/javascriptcore/JavaScriptCore/API/JSBase.cpp:30:
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSVariableObject.h:43:11: 附注:QTJSC::JSVariableObject::JSVariableObject(const QTJSC::JSVariableObject&)
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSVariableObject.h:43:11: 附注: 备选需要 1 实参,但提供了 2 个
In file included from ../3rdparty/javascriptcore/JavaScriptCore/API/APICast.h:30:0,
                 from ../3rdparty/javascriptcore/JavaScriptCore/API/JSBase.cpp:30:
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h: 在构造函数‘QTJSC::JSGlobalObject::JSGlobalObject(QTWTF::NonNullPassRefPtr<QTJSC::Structure>, QTJSC::JSGlobalObject::JSGlobalObjectData*, QTJSC::JSObject*)’中:
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h:173:47: 错误:对‘QTJSC::JSVariableObject::JSVariableObject(QTWTF::NonNullPassRefPtr<QTJSC::Structure>&, QTJSC::JSGlobalObject::JSGlobalObjectData*&)’的调用没有匹配的函数
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h:173:47: 附注:备选是:
In file included from ../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h:27:0,
                 from ../3rdparty/javascriptcore/JavaScriptCore/API/APICast.h:30,
                 from ../3rdparty/javascriptcore/JavaScriptCore/API/JSBase.cpp:30:
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSVariableObject.h:86:9: 附注:QTJSC::JSVariableObject::JSVariableObject(QTWTF::NonNullPassRefPtr<QTJSC::Structure>, QTJSC::JSVariableObject::JSVariableObjectData*)
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSVariableObject.h:86:9: 附注:  no known conversion for argument 2 from ‘QTJSC::JSGlobalObject::JSGlobalObjectData*’ to ‘QTJSC::JSVariableObject::JSVariableObjectData*’
In file included from ../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h:27:0,
                 from ../3rdparty/javascriptcore/JavaScriptCore/API/APICast.h:30,
                 from ../3rdparty/javascriptcore/JavaScriptCore/API/JSBase.cpp:30:
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSVariableObject.h:43:11: 附注:QTJSC::JSVariableObject::JSVariableObject(const QTJSC::JSVariableObject&)
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSVariableObject.h:43:11: 附注: 备选需要 1 实参,但提供了 2 个
In file included from ../3rdparty/javascriptcore/JavaScriptCore/API/APICast.h:30:0,
                 from ../3rdparty/javascriptcore/JavaScriptCore/API/JSBase.cpp:30:
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h: 在成员函数‘QTJSC::JSGlobalObject::JSGlobalObjectData* QTJSC::JSGlobalObject::d() const’中:
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h:270:100: 错误:从类型‘QTJSC::JSVariableObject::JSVariableObjectData* const’到类型‘QTJSC::JSGlobalObject::JSGlobalObjectData*’中的 static_cast 无效
In file included from ../3rdparty/javascriptcore/JavaScriptCore/API/APICast.h:30:0,
                 from ../3rdparty/javascriptcore/JavaScriptCore/API/JSBase.cpp:30:
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h: 在成员函数‘void QTJSC::JSGlobalObject::addStaticGlobals(QTJSC::JSGlobalObject::GlobalPropertyInfo*, int)’中:
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h:327:18: 错误:‘struct QTJSC::JSGlobalObject::JSGlobalObjectData’没有名为‘registerArray’的成员
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h:328:48: 错误:‘struct QTJSC::JSGlobalObject::JSGlobalObjectData’没有名为‘registerArray’的成员
In file included from ../3rdparty/javascriptcore/JavaScriptCore/API/APICast.h:30:0,
                 from ../3rdparty/javascriptcore/JavaScriptCore/API/JSBase.cpp:30:
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h: 在成员函数‘QTJSC::JSGlobalObject::JSGlobalObjectData* QTJSC::JSGlobalObject::d() const’中:
../3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h:270:103: 警告:在有返回值的函数中,控制流程到达函数尾 [-Wreturn-type]
make[1]: *** [obj/release/JSBase.o] 错误 1
make[1]:正在离开目录 `/home/ligo/qttools/qt/qt-everywhere-opensource-src-4.8.1/src/script'
make: *** [sub-script-make_default-ordered] 错误 2

shit!搞这玩意儿的人都是吃屎的,难道也像我开发软件一样不做测试的吗?
这个问题很难找,通过bing才搜索到一个网址
http://archive.linuxfromscratch.org/mail-archives/blfs-dev/2012-April/022605.html
,下载了一个补丁 qt-everywhere-opensource-src-4.8.0-gcc-4.7.patch(需要在网页上往回到补丁列表中下载)。
patch文件如何用?又犯难了,只好再搜索,查到http://wenku.baidu.com/view/7bce1c1910a6f524ccbf8520.html,原来直接用patch命令就行。以前没有用过,先在命令行下直接输入patch回车,结果显示:

程序“patch”尚未安装。  您可以使用以下命令安装:
apt-get install patch

原来在root用户下,apt-get前无需要sudo!好,我也直接输入apt-get install patch,不一会儿安装完毕。
看了一下,这个命令好像不太好用,这个patch文件也不大,就打开来看,内容很简单,就是需要修改2个文件,每个都是去掉2行添加一行,我直接去修改了对应的文件,然后重新configure,再make。在configure的过程中,中间好像是有一些错误,但最后还是成功了。
现在还在make中,没事,上QT看了一下
http://qt-project.org/doc/qt-4.8/install-x11.html
,多简单。不到12点开始make,2点左右结束,然后:
make install
现在都2点多了,终于结束了,关键是没有报错!~-~
发现,在已安装的程序里没有QT,汗···,只好自己找到安装目录,然后进入Bin目录,里面还是没有qtCreator!双击启动designer,结果画面出来了,但是惨不忍睹,界面一团糟,看不清字,大部分是中文,但字不清楚,翻译严重缺失,字间距可以放个窗口了,晕
难道是系统字体的问题?我把系统语言改成英文,然后重启虚拟机,再启动qtdesigner,结果还是一样!启动qtconfigure,结果界面也一样糟糕,而且似乎找不到修改语言的选项,哎,梦一场啊。

5.10:
昨天晚上没有加班,下班走人,今天照样上班。本来预报的是周3、4、5、6都有雨,结果今天都周4了,也没见到雨,可能预报天气的在忽悠我等吧。
安装的qt不能用,我毫无办法了。但是下载的那个sdk一直没有安装上去,就想拿它再试试。昨天一直往虚拟机上拷贝,结果无论如何都拷贝不上去,没办法,昨天快下班时,在本机上开了个www服务器,然后在虚拟机上登录www服务器才算是把qtsdk给传过去了。
刚刚安装<sdk>,直接运行它说是没有权限,就按照nokia上的说明,先修改什么模式(注:这两天都是用root用户登录的系统):
chmod u+x <sdk>
然后再运行它,成功了,出现了安装向导,梦寐以求啊。把所有内容全部选上,然后下一步,不多时,安装完毕。直接启动qtcreator,新建一个桌面工程,包含原始的代码,直接构建,结果如下:

:-1: 错误:cannot find crt1.o: No such file or directory
:-1: 错误:cannot find crti.o: No such file or directory
:-1: 错误:collect2: error: ld returned 1 exit status

晕,看来crtx.o的踒是必需设置的了,但要如何设置呢?根据
http://qt-project.org/doc/qt-4.8/install-x11.html
的提示,再加上前面的错误的解决,决定添加一个环境变量:
setenv LIBARAY_PATH /usr/lib/i386-linux-gnu
结果提示“setenv: command not found”

搜索添加环境变量,到http://blog.csdn.net/guolele2010/article/details/6310904,按照其第三个方法“所有用户的全局设置”,我直接用gedit打开 /etc/profile 文件,然后在最后添加了一行:
export LIBRARY_PATH=/usr/lib/i386-linux-gnu
保存,然后在命令行中:
source /etc/profile
echo #LIBRARY_PATH
有显示了,正是我设置的路径,再构建工程,还是一样的错误,然后重启qtcreator,再构建,仍然不变!晕~~~
我再把这个路径加入到PATH变量中,同样的方法,加到LIBRARY_PATH的后面,结果仍然是相同的错误。难道需要重启?汗!真的需要重启虚拟机!重启之后,直接打开这个工程,然后编译顺利通过,然后运行,出窗口了!
到此,qt总算是成功了,不过可能是拐了8个360度的弯罢了。后面还有ffmpeg需要安装,可能又是一项大工程。
从svn上下载最新的ffmpeg,然后拷贝到虚拟机上,进入目录,也同样:
./configure
结果提示 bash: ./configure: Permission denied
说是没有执行模式,所以需要修改一下(http://blog.sina.com.cn/s/blog_5ff8e88e010110aj.html):
chmod +x configure
然后再执行,结果:
bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory
搜索到
http://hi.baidu.com/zhangtqqq/blog/item/87a511331ecd405dad4b5f1e.html
,按照上面的方法,直接调用dos2unix命令,结果显示没有,就安装它:
apt-get install dos2unix
很小,三两下就安装完了,然后:
dos2unix configure
./configure
提示:
yasm not found, use --disable-yasm for a crippled build
然后再:
./configure --disable-yasm
不一会儿完成。然后:
make
大约10分钟之后提示:

libavcodec/x86/h264_qpel_mmx.c: Assembler messages:
libavcodec/x86/h264_qpel_mmx.c:1294: Error: operand type mismatch for `cmp'
libavcodec/x86/h264_qpel_mmx.c:1294: Error: operand type mismatch for `cmp'
libavcodec/x86/h264_qpel_mmx.c:1298: Error: operand type mismatch for `cmp'
libavcodec/x86/h264_qpel_mmx.c:1298: Error: operand type mismatch for `cmp'
libavcodec/x86/h264_qpel_mmx.c:964: Error: operand type mismatch for `cmp'
libavcodec/x86/h264_qpel_mmx.c:964: Error: operand type mismatch for `cmp'
libavcodec/x86/h264_qpel_mmx.c:964: Error: operand type mismatch for `cmp'
make: *** [libavcodec/x86/dsputil_mmx.o] Error 1

在baidu上搜索不到,在bing上搜索到
http://comments.gmane.org/gmane.comp.handhelds.openembedded/51922
,上面列举了多个bug,其中有一个就是这个,点它后面的continue查看这个bug的完整信息,网址为http://permalink.gmane.org/gmane.comp.handhelds.openembedded/51954,实际上通过补丁解决这个问题的,这里还按照上次的补丁做法,直接用gedit打开这个文件来修改,但这次有点麻烦,本来提示出错的行是1294、1298、964,但实际上这个文件只有1201行!
猜测应该是由于宏定义引起的行数变化,没有办法,只有完全依照这个网上的方法来修改了。文件修改了4个位置,都是把“g”改成了“rm”,再继续make,时又报错:

ffmpeg.c: At top level:
ffmpeg.c:248:21: warning: ‘sws_flags’ defined but not used [-Wunused-variable]
CC cmdutils.o
cmdutils.c:43:21: fatal error: version.h: No such file or directory
compilation terminated.
make: *** [cmdutils.o] Error 1

My god!网上搜遍了,也找不到解决办法,没有碰到一个有说这个问题的!在ffmpeg的安装说明上非常简单,就三步,configure,make,make install。我搜索原始的ffmpeg目录,没有看到version.h文件,又上到ffmpeg的svn服务器上,看了几个版本都没有这个文件,奇怪了。但后来注意到ffmpeg的根目录中有一个version.sh文件,我记得似乎有的文件是可以通过执行其它文件来生成的,这里就试一下,结果这个文件不可执行,那也简单,就像前面一个改一下模式:
chmod +x version.sh
然后再执行,可以了,然后直接再make,结果成功了。
再到目录中查看,发现有了version.h文件,现在想起来,前面有次make时,看到一开始就有一行打打印:

/bin/sh: /home/ligo/qttools/qt/ffmpeg_org/version.sh: Permission denied

可能是这个文件不能执行导致了不能自动生成version.h文件。
接着:
make install
不一会儿就成功结束了!现在,全部安装完了,但有可能qt对ffmpeg的库和头文件还需要设置,等下先试试再说。

网上搜索到 http://blog.csdn.net/betty_ting/article/details/5769701

在重新装过一个Ubuntu10.04的虚拟机后,又重新在Ubuntu上装了QT4 和QT Creator 2.0,然后重新下载源码编译过ffmpeg。后来能够在QT中直接调用了ffmpeg中的库函数。这里调用的前提是:
      1>ffmpeg的正确编译与安装;
      2>在QT Creator所建的工程中,.pro文件的正需修改;要改的关键地方是
      LIB += -L.  -lavcodec -lavformat……
      INCLUDEPATH += .  ./ffmpeg  ./libavcodec ./libavformat ……
      3>在夹头文件时,应将#include<>加在intern “C”{}里。

这看起来似乎有点麻烦,还是再摸索一下吧。

 

总结:
为了安装开发工具qt和ffmpeg,而必需安装它们所依赖的库。一个是要选对操作系统,一个是要选对库。这里的操作系统缺少g++库,所以要安装gcc库(其中包含了g++),而gcc又依赖其它多个库,要一一安装,由于一些库的路径问题,导致必需设置环境变量才能进行后面的步骤。

 

抱歉!评论已关闭.