今天,博主接到一个任务,通过RPC实现windows和linux之间的通信,博主在网上找了N久未果,基本上都是说windows平台下的RPC调用。于是博主想换一下思路,先找Linux下的RPC调用,然后再考虑两者的通信。先装linux吧,博主用的是Red hat9。在虚拟机上装完想编译一个IDL文件,傻眼了,red hat未装GCC(linux系统下编程的编译器),没办法,只好先装GCC。于是,博主花了一个下午+一个晚上的时间解决安装GCC时遇到的困难,终于用上GCC了。花了那么长时间才装上GCC,博主表示非常惭愧。刚刚接触linux,此文的目的是总结一下学习经验同时也为那些和我一样刚刚接触linux的新手提供一个交流学习经验的平台,高手的话可以直接忽略此文。好了,闲话少说,下面是博主遇到的具体问题和解决方法。(有遗漏和有待改进之处,望请指正)
博主首先按照网上标准流程安装GCC(安装步骤如下)
-----------------------------------------------------------------------------------------------------------------------------------------------------
原文地址
下载
在GCC网站上(http://gcc.gnu.org/)或者通过网上搜索可以查找到下载资源。目前GCC的最新版本为 3.4.0。可供下载的文件一般有两种形式:gcc-3.4.0.tar.gz和gcc-3.4.0.tar.bz2,只是压缩格式不一样,内容完全一致,下载其中一种即可。
解压缩
根据压缩格式,选择下面相应的一种方式解包(以下的“%”表示命令行提示符):
% tar xzvf gcc-3.4.0.tar.gz
或者
% bzcat gcc-3.4.0.tar.bz2 | tar xvf -
新生成的gcc-3.4.0这个目录被称为源目录,用${srcdir}表示它。以后在出现${srcdir}的地方,应该用真实的路径来替换它。用pwd命令可以查看当前路径。
在${srcdir}/INSTALL目录下有详细的GCC安装说明,可用浏览器打开index.html阅读。
建立目标目录
目标目录(用${objdir}表示)是用来存放编译结果的地方。GCC建议编译后的文件不要放在源目录${srcdir}中(虽然这样做也可以),最好单独存放在另外一个目录中,而且不能是${srcdir}的子目录。
例如,可以这样建立一个叫 gcc-build 的目标目录(与源目录${srcdir}是同级目录):
% mkdir gcc-build
% cd gcc-build
以下的操作主要是在目标目录 ${objdir} 下进行。
配置
配置的目的是决定将GCC编译器安装到什么地方(${destdir}),支持什么语言以及指定其它一些选项等。其中,${destdir}不能与${objdir}或${srcdir}目录相同。
配置是通过执行 ${srcdir}下的configure来完成的。其命令格式为(记得用你的真实路径替换${destdir})
% ${srcdir}/configure --prefix=${destdir} [其它选项]
例如,如果想将GCC 3.4.0安装到/usr/local/gcc-3.4.0目录下,则${destdir}就表示这个路径。
在我的机器上,我是这样配置的:
% ../gcc-3.4.0/configure --prefix=/usr/local/gcc-3.4.0 --enable-threads=posix --disable-checking --enable--long-long --host=i386-redhat-linux --with-system-zlib --enable-languages=c,c++,java
将GCC安装在/usr/local/gcc-3.4.0目录下,支持C/C++和JAVA语言,其它选项参见GCC提供的帮助说明。
编译
% make
这是一个漫长的过程。在我的机器上(P4-1.6),这个过程用了50多分钟。
安装
执行下面的命令将编译好的库文件等拷贝到${destdir}目录中(根据你设定的路径,可能需要管理员的权限):
% make install
至此,GCC 3.4.0安装过程就完成了。
其它设置
GCC 3.4.0的所有文件,包括命令文件(如gcc、g++)、库文件等都在${destdir}目录下分别存放,如命令文件放在bin目录下、库文件在 lib下、头文件在include下等。由于命令文件和库文件所在的目录还没有包含在相应的搜索路径内,所以必须要作适当的设置之后编译器才能顺利地找到并使用它们。
gcc、g++、gcj的设置
要想使用GCC 3.4.0的gcc等命令,简单的方法就是把它的路径 ${destdir}/bin放在环境变量PATH中。我不用这种方式,而是用符号连接的方式实现,这样做的好处是我仍然可以使用系统上原来的旧版本的GCC编译器。
首先,查看原来的gcc所在的路径:
% which gcc
在我的系统上,上述命令显示:/usr/bin/gcc。因此,原来的gcc命令在/usr/bin目录下。我们可以把GCC 3.4.0中的gcc、g++、gcj等命令在/usr/bin目录下分别做一个符号连接:
% cd /usr/bin
% ln -s ${destdir}/bin/gcc gcc34
% ln -s ${destdir}/bin/g++ g++34
% ln -s ${destdir}/bin/gcj gcj34
这样,就可以分别使用gcc34、g++34、gcj34来调用GCC 3.4.0的gcc、g++、gcj完成对C、C++、JAVA程序的编译了。同时,仍然能够使用旧版本的GCC编译器中的gcc、g++等命令。
库路径的设置
将${destdir}/lib路径添加到环境变量LD_LIBRARY_PATH中,最好添加到系统的配置文件中,这样就不必要每次都设置这个环境变量了。
例如,如果GCC 3.4.0安装在/usr/local/gcc-3.4.0目录下,在RH Linux下可以直接在命令行上执行或者在文件/etc/profile中添加下面一句:
$LD_LIBRARY_PATH
测试
用新的编译命令(gcc34、g++34等)编译你以前的C、C++程序,检验新安装的GCC编译器是否能正常工作。
根据需要,可以删除或者保留${srcdir}和${objdir}目录。
-----------------------------------------------------------------------------------------------------------------------------------------------------
我是通过windows平台下到网上搜来的安装包,然后复制到U盘上,然后接到虚拟机上,最后挂接到linux系统上。发现linux下上网下载东西实在不方便,可能我刚刚接触linux,高手莫笑!!!
挂接执行
#mkdir /mnt/udisk
#fdisk -l
#mount -t vfat /dev/sdb1 /mnt/udisk
这里要注意的是接U盘到虚拟机时必须用鼠标点击虚拟机后才插上U盘,这样才能被Linux识别,不然很可能被windows识别了,会挂接失败的。博主试了很多次,可怜我那刚买的U盘了。
-----------------------------------------------------------------------------------------------------------------------------------------------------
博主不才,在配置GCC安装环境时(也就是执行# % ../gcc-3.4.0/configure --prefix=/usr/local/gcc-3.4.0 --enable-threads=posix --disable-checking --enable--long-long --host=i386-redhat-linux --with-system-zlib --enable-languages=c,c++,java 时)遇到configure: error: no acceptable C compiler found in $PATH 的问题,这个问题是因为red hat9未装C编译器,或者C编译器未包含到系统调用路径中。于是,博主又就毛手毛脚地去鼓捣安装C编译器。去坛子里搜安装C编译器步骤时,某高人指点说直接跳过此步,安装GCC rpm,貌似是GCC编译器的一个编译后版本,然后安装到linux上就可以了。于是博主又跑去鼓捣rpm。
gcc rpm安装可参考http://www.5dlinux.com/article/3/2007/linux_8170.html
结果博主又一次失败了,不过博主不气馁。来分析一下问题,这次博主碰到的问题是在导入rpm文件时,新安装的rpm文件与系统原有的文件发生冲突,linux终端提示conflict with .... 于是博主又去翻资料,找到一篇介绍《初学者安装RPM包快速应急手册》,摘录如下:
----------------------------------------------------------------------------------------------------------------------------------------------------
用RPM包方式来发布软件变得越来越流行,主要的原因是这种软件发布方式很方便用户安装、升级和从系统中删除。除此之外,RPM还可以让你有更多的对系统安装的软件的管理性功能,例如可以查新系统有哪些已经安装的软件包,查看这些软件包分别安装了什么文件,这些文件又放在了什么地方等等。
这里我给出一个简单的入门手册,供初学者查看参考,快速使用RPM。这些RPM命令都是最最常用的,更复杂的功能大家可以暂时不用管,等确实需要的时候再去查man手册。:)
下面我们开始吧。安装一个RPM包的一般采用的命令格式如下:
# rpm -ivh package.ix86.rpm
在上面的命令中,package是个假定的名字,ix86是这个包为特定的CPU做了优化处理的意思。例如,package可能是ldconfig-1.9.5-14,而ix86是i386这样的。
“-i”参数指明是要安装这个package,而“-v”这个参数则使输出信息增加,“-h”表示在安装过程中显示hashes作为在安装过程的一个进度条。
上面就是所有的关于安装一个RPM包的内容,非常简单而好用吧。当然如果你安装过程中遇到了一些包依赖关系的问题那就稍微要麻烦一些了。包依赖关系问题就是说,你正在安装的包需要其他的包的支持才能正常工作。通常还有可能遇到的问题是所安装的包需要某个软件或者函数库的特定版本才能正常工作。这样的情况下,你可以安装或者升级依赖的软件包,然后继续安装你自己需要安装的软件包。
下面我们来看其他的一些非常有用的rpm命令。
如果你要看一个RPM包安装以后到底安装了那些文件,你可以使用这个命令:
# rpm -ql packagename
这个packagename就是你要查询的软件包的名字,例如ldconfig-1.9.5-14mdk;而“-p”参数表示查询软件包数据库,看这个软件包是否已经安装;“-l”参数表示列出所查询的包的所有安装了的文件的完整的路径。
下面是一个例子:
[wh@infonet wh]$ rpm -ql ldconfig-1.9.5-14mdk
/sbin/ldconfig
/usr/doc/ldconfig-1.9.5
/usr/doc/ldconfig-1.9.5/README
除了你查询某个软件包的信息这个实用功能外,还可以很方便的删除某个特定的RPM包软件。采用的命令参数是“-e“,格式如下:
# rpm -e packagename
“-e”就表示删除(erase)的意思,就是把特定的软件包(packagename)删除掉。
值得注意的是,rpm管理机制不允许你删除某个软件包,如果这个软件包还被其他软件包所依赖。因为一旦你删除了这个软件包,其他依赖他才能运行的软件包也就不能正常使用了。
已经学会了如何安装和如何删除一个rpm软件包,下面我们看看如何升级一个已经存在的rpm包软件。升级其实和安装类似,可以参考下面的命令:
# rpm -Uvh package.ix86.rpm
“-U“参数表示是升级(upgrade),参数“v”和“h”意义和前面一样的,这里不再赘述。
到此,我们已经学会了,如何安装、删除和升级一个使用rpm发布的软件了。:)
-----------------------------------------------------------------------------------------------------------------------------------------------------
博主,心想如果导入rpm包发生冲突,不如就用#rpm -Uvh命令更新rpm文件,事实证明这招很管用,强烈建议选用更新命令导入rpm,这样做的好处有两点:1.如果原先存在rpm包,则导入操作不会引起冲突,而是直接升级至最新版本。2.如果原先不存在rpm包,则系统会提示不存在rpm,这时可以用-ivh命令而不用担心留下脏文件,因为你导入的文件就是系统所需要的,如果导入不成功,可删也可升级。命令和效果不同,但殊途同归,看个人选择。可参见http://www.linuxidc.com/Linux/2007-09/7327.htm,很不幸的是博主在编译binutils-2.15.tar.bz2执行./configure时又失败,其实可以跳过编译binutils-2.15这一项,直接执行下面的命令安装rpm。但是要注意上面链接里———都应改为——,如———nodeps 应改为——,而———replacefiles应改为——replacefiles。
上文提到的GCC版本检查指令很好用:
安装完毕之后,我们用命令可以查看相关版本
#gcc ---version /* 查看gcc版本 */
#/lib/libc.so.6 /* 查看glibc的版本 */
如此一来,博主终于用上GCC了,但是回过头编译binutils-2.15.tar.bz2时又遇到configure: error: C compiler cannot create executables 的错误,此时夜已经深了,这个问题,博主也没有解决,希望哪位路过的高手给指点一下,不胜感激。
另外附上一篇无比实用的rpm安装总结