Linux下C开发环境的搭建过程
前言
在Linux系统中,软件安装程序比较纷繁复杂,不过最常见的有两种:
1)一种是软件的源代码,您需要自己动手编译它。这种软件安装包通常是用gzip压缩过的tar包(后缀为.tar.gz)。
2)另一种是软件的可执行程序,你只要安装它就可以了。这种软件安装包通常被是一个RPM包(RedhatLinux Packet Manager,就是Redhat的包管理器),后缀是.rpm。
Linux和C天生就有不解之缘,Linux操作系统的内核主要就是用C写的,另外Linux下的很多软件也是用C写的,特别是一些著名的服务软件,比如MySQL、Apache等。初学者在编译MySQL这样的软件时,可能遇到过各式各样的错误,其实只要你初步了解了Linux的C开发环境,你就能自行解决这些错误。
Linux的C开发环境与Windows的有所不同,在Linux下,一个完整的C开发环境由以下三个部分组成:
1、函数库:glibc
要构架一个完整的C开发环境,Glibc是必不可少的,它是Linux下C的主要函数库。Glibc有两种安装方式:
A、安装成测试用的函数库——在编译程序时用不同的选项来试用新的函数库
B、安装成主要的C函数库——所有新编译程序均用的函数库
Glibc含几个附加包:LinuxThreads、locale和crypt,通常它们的文件名随版本不同而类似于下列文件名:
glibc-2.06.tar.gz
glibc-linuxthreads-2.0.6.tar.gz
glibc-localedate-2.0.6.tar.gz
glibc-crypt-2.0.6.tar.gz
2、编译器:gcc
gcc(GNU CCompiler)是GNU推出的功能强大、性能优越的多平台编译器,gcc编译器能将C、C++语言源程序、汇编程序和目标程序编译、连接成可执行文件,以下是gcc支持编译的一些源文件的后缀及其解释:
3、系统头文件:glibc_header
缺少了系统头文件的话,很多用到系统功能的C程序将无法编译。
在Linux下安装GCC的具体过程
下面以CentOS4.8为例,介绍如何搭建Linux的C开发环境,如果是更高版本的CentOS也可以参考,只是要注意软件版本的不同。
GCC建议我们将一个版本的GCC安装在一个单独的目录下。这样做的好处是将来不需要它的时候可以方便地删除整个目录即可(因为GCC没有uninstall功能);并且在安装完成后,仍然能够使用原来低版本的GCC编译器,即一个系统上可以同时存在并使用多个版本的GCC编译器。缺点是在安装完成后要做一些设置工作才能使编译器工作正常。
1、下载GCC
到官方网站http://gcc.gnu.org或官方FTP站ftp://ftp.gnu.org/gnu(建议使用FlashFXP下载工具)可以查找到下载资源。目前GCC的最新版本为4.5.1。可供下载的文件一般有两种形式:gcc-4.5.1.tar.gz和gcc-4.5.1.tar.bz2,只是压缩格式不一样,内容完全一致,下载其中一种即可。
2、解压缩
根据压缩格式,选择下面相应的一种方式解包:
tar
根据个人所好选择解压位置,新生成的gcc-4.5.1这个目录被称为源目录,我们用${srcdir}表示它。以后在出现${srcdir}的地方,应该用真实的路径来替换它。在${srcdir}/INSTALL目录下有详细的GCC安装说明,可用浏览器打开index.html阅读。
我选择将gcc和glibc分别安装在/opt/gcc-4.5.1和/opt/glibc-2.7下,因为若选择安装在/、/usr、/usr/local等位置,一些库文件会默认安装到/lib下,有些库会默认安装到/usr/lib下,从而覆盖掉原有的工具链,这是我们所不希望的。
[root@localhost test]# pwd
/test/
[root@localhost test]# ls
gcc-4.5.1.tar.gz
[root@localhost test]# tar zvxf gcc-4.5.1.tar.gz
[root@localhost test]# ls
gcc-4.5.1
3、建立目标目录
目标目录(用${objdir}表示)是用来存放编译结果的地方。GCC建议编译后的文件不要放在源目录${srcdir]中(虽然这样做也可以),最好单独存放在另外一个目录中,而且不能是${srcdir}的子目录。
例如,可以这样建立一个叫 gcc-build 的目标目录(与源目录${srcdir}是同级目录):
[root@localhost test]# pwd
/test
[root@localhost test]# mkdirgcc-build
[root@localhost test]# ls
gcc-4.5.1
以下的操作主要是在目标目录 ${objdir} 下进行。
4、配置
配置的目的是决定将GCC编译器安装到什么地方(${destdir}),支持什么语言以及指定其它一些选项等。其中,${destdir}不能与${objdir}或${srcdir}目录相同。
配置是通过执行${srcdir}下的configure来完成的。其命令格式为(记得用你的真实路径替换${srcdir}和${destdir}):
${srcdir}/configure
例如,如果想将GCC4.5.1安装到/opt/gcc-4.5.1目录下,则${destdir}就表示这个路径。
在我的机器上,我是这样配置的:
[root@localhost test]# cdgcc-build/
[root@localhost gcc-build]# ../gcc-4.5.1/configure--prefix=/opt/gcc-4.5.1
--enable-threads=posix
--host=i386-RedHat-linux
--enable-languages=c,c++,java
这样就将GCC安装在/opt/gcc-4.5.1目录下,支持C/C++和JAVA语言,其它选项参见GCC提供的帮助说明。
注:这里有一个问题:如果系统上没有装过编译器,是不能安装源代码形式的GCC的。——悲剧就这样发生了~
configure: error: no acceptable C compiler found in$PATH
See `config.log' for more details.
这种情况下,只能到网上找一个与系统相适应的RPM二进制形式的GCC软件包来安装。这里不多说了,请参照另一篇博文吧!
还有一个问题(怎么我安装的时候就这么多问题啊~),GCC编译需要GMP、MPFR、MPC这三个库:
configure: error: Building GCC requires GMP 4.2+, MPFR 2.3.1+ andMPC 0.8.0+.
说明要安装gcc需要GMP、MPFR、MPC这三个库,可以从ftp://gcc.gnu.org/pub/gcc/infrastructure下载相应的压缩包。由于MPFR依赖GMP,而MPC依赖GMP和MPFR,所以要先安装GMP,其次MPFR,最后才是MPC。这里三个库我用的版本分别是gmp4.3.2,mpfr2.4.2和mpc0.8.1。
先开始安装GMP。解压GMP的压缩包后,得到源代码目录gmp-4.3.2。在该目录的同级目录下建立一个临时的编译目录,这里命名为gmp-build。然后开始配置安装选项,进入gmp-build目录,输入以下命令进行配置:
[root@localhost gmp-build]# pwd
/test/gmp-build
[root@localhost gmp-build]# ../gmp-4.3.2/configure--prefix=/opt/gmp-4.3.2
这里--prefix选项代表要将该库安装在哪里,我是装在/opt/gmp-4.3.2目录下,后面的安装都会用到这个选项。
这时在gmp的编译目录下就会生成一个makefile文件,现在开始编译安装。
[root@localhost gmp-build]# make
[root@localhost gmp-build]# makeinstall
这样就安装好了gmp。mpfr和mpc的安装方法与此类似。不过在配置的时候要注意把依赖关系选项加进去,具体命令如下:
[root@localhost mpfr-build]# ../mpfr-2.4.2/configure
[root@localhost mpc-build]# ../mpc-0.8.1/configure
安装好这三个库之后,就可以正式安装gcc了。可能需要在选项处添加上面三个库的位置,如:--with-gmp=/opt/gmp-4.3.2
5、编译
[root@localhost gcc-build]# make
很长时间才能编译完,要有耐心。约用40分钟(可能更长、巨长……)吧,只有等待。
6、安装
执行下面的命令将编译好的库文件等拷贝到/opt/gcc-4.5.1目录下(根据你设定的路径,可能需要管理员的权限),这才是真正的安装:
[root@localhost gcc-build]# makeinstall
7、链接
gcc、g、gcj的设置。要想使用GCC的gcc等命令,简单的方法就是用符号链接的方式把它链接到/user/bin目录下:
[root@localhost gcc-build]# cd
[root@localhost bin]# ln -s /opt/gcc-4.5.1/bin/gccgcc
[root@localhost bin]# ln -s /opt/gcc-4.5.1/bin/gg
[root@localhost bin]# ln -s/opt/gcc-4.5.1/bin/gcj gcj
这样,就可以分别使用gcc、g、gcj命令来分别快速编C、C++、JAVA的程序了。
8、Test
test.c代码如下:
#include
main()
{
printf("Hello world!\n");
}
[root@localhost ~]# cd/test
[root@localhost test]#gcctest.c
[root@localhost test]#./a.out
Hello world!
----------------------------------------------
说来惭愧,学习嵌入式系统设计与应用已快一学期了,竟然还未用GCC编译个程序,更不用说使用其他编程环境了,其原因在于我的系统上没有GCC,想装一个可是不知道怎样个装法,Google了一下,发现基本上都是介绍系统上已有GCC的那种安装源码形式的GCC,我系统上本来就没有gcc,所以不能安装源码形式的gcc,那怎样解决这种状况呢?
解决方法有三种:
① 重装系统,在安装时选择定制安装包,选上GCC或选完全安装;
③ 安装二进制形式的GCC(.rpm)
下面介绍安装二进制形式的gcc(看起来比较麻烦):
事先确定要安装与系统相适应的rpm,由此找到下面这个网址:
http://mirrors.jtlnet.com/centos/4/apt/i386/RPMS.os/
里面很全,基本涵盖了安装gcc所需的所有rpm。
注意:下文的 $ 表示终端。
1)安装gcc
下载:gcc-3.4.6-11.i386.rpm(不要下成gcc4,详见文章最后)
$ rpm -ivh gcc-3.4.6-11.i386.rpm
warning: gcc-3.4.6-11.i386.rpm: V3DSA signature: NOKEY, key ID 443e1821
error: Faileddependencies:
Suggestedresolutions:glibc-devel-2.3.4-2.43.i386.rpm
libgomp-4.1.2-44.EL4.i386.rpm
根据错误信息→1-1,1-2
1-1)更新glibc-devel
下载:glibc-devel-2.3.4-2.43.i386.rpm
$ rpm -ivhglibc-devel-2.3.4-2.43.i386.rpm
warning: glibc-devel-2.3.4-2.43.i386.rpm: V3 DSA signature: NOKEY,key ID 443e1821
error: Failed dependencies:
根据错误信息→1-1-1
1-1-1)安装glibc-headers
下载:glibc-headers-2.3.4-2.39.i386.rpm
$ rpm -ivhglibc-headers-2.3.4-2.39.i386.rpm
warning: glibc-headers-2.3.4-2.43.i386.rpm: V3 DSA signature:NOKEY, key ID 443e1821
error: Failed dependencies:
根据错误信息→1-1-1-1
1-1-1-1)安装glibc-kernheaders
下载:glibc-kernheaders-2.4-9.1.103.EL.i386.rpm
$ rpm -ivhglibc-kernheaders-2.4-9.1.103.EL.i386.rpm
返回1-1-1):
$ rpm -ivhglibc-headers-2.3.4-2.39.i386.rpm
返回1-1):
$ rpm -ivhglibc-devel-2.3.4-2.43.i386.rpm
1-2)更新libgomp
下载:libgomp-4.1.2-44.EL4.i386.rpm
$ rpm -ivhlibgomp-4.1.2-44.EL4.i386.rpm
返回1):
$ rpm -ivhgcc4-4.1.2-44.EL4.i386.rpm
强烈注意,下载gcc时不要下成gcc4,不然又是一个大大的杯具~
安装完成,查看 $ gcc -v ,显示:-bash:gcc: command not found
偶迈嘎!又$rpm -q gcc,显示:packagegcc is not installed
Why?没理由啊……
百度、Google一通下来,终于被牛人一语惊醒:
$ gcc4
gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)
内牛满面跪拜此帖:http://www.linuxgoo.com/bbs/archiver/63528.html
还是那句话,一味的追求新鲜,只会让自己步履维艰。我还是用回我的gcc3吧……%>_
-----------------------------------------------
有些软件可能要求系统的 Glibc 高于某个版本才可以正常运行,如果您的 Glibc 低于要求的版本,为了运行这些软件,您就不得不升级您的 Glibc了。比如:
qq: error while loading shared libraries: requires glibc 2.5 orlater dynamic linker
您可以寻找已经编译好的rpm包或者使用源代码的方式升级Glibc。
RPM包方式安装glibc
RPM虽然比较容易安装,但就是依赖问题不好解决。给出一个下载地址:
http://mirrors.jtlnet.com/centos/5.5/os/i386/CentOS/
$ rpm –ivhglibc-2.5-49.i386.rpm
不过我用的是CentOS4.8,貌似不能兼容……
error: Failed dependencies:
安装完成后,可以查看是否已升级:
$ ls -l/lib/libc.so.6
lrwxrwxrwx 1 root root 11 10-08 22:08 /lib/libc.so.6-> libc-2.5.so
编译安装glibc
下载glibc
[root@localhost test]# pwd
/test
[root@localhost test]# wget
下载glibc-linuxthreads
[root@localhost test]# wgethttp://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.5.tar.bz2
解压
[root@localhost test]# tar -jvxfglibc-2.9.tar.bz2
[root@localhost test]# cd glibc-2.9
[root@localhost glibc-2.9]# tar -jvxf../glibc-linuxthreads-2.5.tar.bz2
配置
[root@localhost glibc-2.9]# cd ..
[root@localhost test]# export CFLAGS="-g -O2-march=i486"
[root@localhost test]# mkdirglibc-build
[root@localhost test]# cd glibc-build
[root@localhost glibc-build]# ../glibc-2.9/configure--prefix=/usr --disable-profile --enable-add-ons
安装
[root@localhost glibc-build]# make
[root@localhost glibc-build]# make install
安装编译过程中需要注意三点:
1、要将glibc-linuxthreads解压到glibc目录下。
2、不能在glibc当前目录下运行configure。
3、否则如果出现错误:error"glibc cannot be compiled without optimization",需要加上优化开关:[root@localhosttest]# export CFLAGS="-g -O2-march=i486"
联系客服