当前位置:首页 » 编程软件 » c编译器怎么扩展

c编译器怎么扩展

发布时间: 2022-11-07 03:00:19

‘壹’ linux 下如何装 C 编译

2004年4月20日最新版本的GCC编译器3.4.0发布了。目前,GCC可以用来编译C/C++、FORTRAN、java、OBJC、ADA等语言的程序,可根据需要选择安装支持的语言。GCC 3.4.0比以前版本更好地支持了C++标准。本文以在Redhat Linux上安装GCC3.4.0为例,介绍了GCC的安装过程。

安装之前,系统中必须要有cc或者gcc等编译器,并且是可用的,或者用环境变量CC指定系统上的编译器。如果系统上没有编译器,不能安装源代码形式的GCC 3.4.0。如果是这种情况,可以在网上找一个与你系统相适应的如RPM等二进制形式的GCC软件包来安装使用。本文介绍的是以源代码形式提供的GCC软件包的安装过程,软件包本身和其安装过程同样适用于其它Linux和Unix系统。

系统上原来的GCC编译器可能是把gcc等命令文件、库文件、头文件等分别存放到系统中的不同目录下的。与此不同,现在GCC建议我们将一个版本的GCC安装在一个单独的目录下。这样做的好处是将来不需要它的时候可以方便地删除整个目录即可(因为GCC没有uninstall功能);缺点是在安装完成后要做一些设置工作才能使编译器工作正常。在本文中我采用这个方案安装GCC 3.4.0,并且在安装完成后,仍然能够使用原来低版本的GCC编译器,即一个系统上可以同时存在并使用多个版本的GCC编译器。

按照本文提供的步骤和设置选项,即使以前没有安装过GCC,也可以在系统上安装上一个可工作的新版本的GCC编译器。

1. 下载

在GCC网站上( http://gcc.gnu.org/)或者通过网上搜索可以查找到下载资源。目前GCC的最新版本为 3.4.0。可供下载的文件一般有两种形式:gcc-3.4.0.tar.gz和gcc-3.4.0.tar.bz2,只是压缩格式不一样,内容完全一致,下载其中一种即可。

2. 解压

根据压缩格式,选择下面相应的一种方式解包(以下的“%”表示命令行提示符):

% 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阅读。

3. 建立目标目录

目标目录(用${objdir}表示)是用来存放编译结果的地方。GCC建议编译后的文件不要放在源目录${srcdir]中(虽然这样做也可以),最好单独存放在另外一个目录中,而且不能是${srcdir}的子目录。

例如,可以这样建立一个叫 gcc-build 的目标目录(与源目录${srcdir}是同级目录):

% mkdir gcc-build
% cd gcc-build

以下的操作主要是在目标目录 ${objdir} 下进行。

4. 配置

配置的目的是决定将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提供的帮助说明。

5. 编译

% make

这是一个漫长的过程。在我的机器上(P4-1.6),这个过程用了50多分钟。

6. 安装

执行下面的命令将编译好的库文件等拷贝到${destdir}目录中(根据你设定的路径,可能需要管理员的权限):

% make install

至此,GCC 3.4.0安装过程就完成了。

6. 其它设置

GCC 3.4.0的所有文件,包括命令文件(如gcc、g++)、库文件等都在${destdir}目录下分别存放,如命令文件放在bin目录下、库文件在lib下、头文件在include下等。由于命令文件和库文件所在的目录还没有包含在相应的搜索路径内,所以必须要作适当的设置之后编译器才能顺利地找到并使用它们。

6.1 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++等命令。

6.2 库路径的设置

将${destdir}/lib路径添加到环境变量LD_LIBRARY_PATH中,最好添加到系统的配置文件中,这样就不必要每次都设置这个环境变量了。

例如,如果GCC 3.4.0安装在/usr/local/gcc-3.4.0目录下,在RH Linux下可以直接在命令行上执行或者在文件/etc/profile中添加下面一句:

setenv LD_LIBRARY_PATH /usr/local/gcc-3.4.0/lib:$LD_LIBRARY_PATH

7. 测试

用新的编译命令(gcc34、g++34等)编译你以前的C、C++程序,检验新安装的GCC编译器是否能正常工作。

8. 根据需要,可以删除或者保留${srcdir}和${objdir}目录。

‘贰’ c语言编译器的功能

目前最流行的C语言编译器有以下几种:
·GNU Compiler Collection 或称 GCC
·Microsoft C 或称 MS C
·Borland Turbo C 或称 Turbo C
这些C语言版本不仅实现了ANSI C标准,而且在此基础上各自作了一些扩充,使之更加方便、完美。

‘叁’ c语言编译器如何运行

编译共分为四个阶段:预处理阶段、编译阶段、汇编阶段、链接阶段。

1、预处理阶段:

主要工作是将头文件插入到所写的代码中,生成扩展名为“.i”的文件替换原来的扩展名为“.c”的文件,但是原来的文件仍然保留,只是执行过程中的实际文件发生了改变。(这里所说的替换并不是指原来的文件被删除)

2、汇编阶段:

插入汇编语言程序,将代码翻译成汇编语言。编译器首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,编译器把代码翻译成汇编语言,同时将扩展名为“.i”的文件翻译成扩展名为“.s”的文件。

3、编译阶段:

将汇编语言翻译成机器语言指令,并将指令打包封存成可重定位目标程序的格式,将扩展名为“.s”的文件翻译成扩展名为“.o”的二进制文件。

4、链接阶段:

在示例代码中,改代码文件调用了标准库中printf函数。而printf函数的实际存储位置是一个单独编译的目标文件(编译的结果也是扩展名为“.o”的文件),所以此时主函数调用的时候,需要将该文件(即printf函数所在的编译文件)与hello world文件整合到一起,此时链接器就可以大显神通了,将两个文件合并后生成一个可执行目标文件。

‘肆’ C,编译器问题

前三个Warning在说"-std=gnu99、-std=c99、-std=c89"这三个东西是用来搞C语言或者ObjC语言的,所以你是不是程序保存的时候后缀存成cpp而不是c了?(前者是c++语言程序文件后缀名,后者是C语言)
最后一个Error解决办法:在菜单栏以此单击"Build"→“Bulid Options”弹出一个对话框,在Category那有个下拉列表的(默认好像是C++ Language),点击选择C Lanuage。然后紧接着下面有五个小钩钩,去掉最后一个。(或者把Raw Options下面那个框里的-fallow-single-precision删掉,是一样的。)点击OK,完成。

‘伍’ 如何使用c语言编译器

得先以你下载的那个编译器把 11.c 编译了, 生成执行文件, 再在cmd中运行这个执行文件.

‘陆’ c语言的宏扩展指什么

简单来说:宏定义又称为宏代换、宏替换,简称“宏”。是C提供的三种预处理功能的其中一种。

复杂的请看下面,讲的很全。下面的带参宏定义,多行宏定义,在Linux内核源码中很多。另外sizeof也是一个宏定义。

宏定义

宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译

1. 不带参数的宏定义:

宏定义又称为宏代换、宏替换,简称“宏”。

格式: #define 标识符 字符串

其中的标识符就是所谓的符号常量,也称为“宏名”。

预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。

掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。

即在对相关命令或语句的含义和功能作具体分析之前就要换:

例: #define PI 3.1415926 把程序中出现的PI全部换成3.1415926

说明:

(1)宏名一般用大写

(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义

(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。

(4)宏定义末尾不加分号;

(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。

(6)可以用#undef命令终止宏定义的作用域

(7)宏定义可以嵌套

(8)字符串" "中永远不包含宏

(9)宏定义不分配内存,变量定义分配内存。

2. 带参数的宏定义:

除了一般的字符串替换,还要做参数代换

格式: #define 宏名(参数表) 字符串

例如:#define S(a,b) a*b

area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2;

类似于函数调用,有一个哑实结合的过程:

(1)实参如果是表达式容易出问题

#define S(r) r*r

area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;

正确的宏定义是#define S(r) ((r)*(r))

(2)宏名和参数的括号间不能有空格

(3)宏替换只作替换,不做计算,不做表达式求解

(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存

(5)宏的哑实结合不存在类型,也没有类型转换。

(6)函数只有一个返回值,利用宏则可以设法得到多个值

(7)宏展开使源程序变长,函数调用不会

(8)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)

3. 宏定义其他冷门、重点知识

#define用法

1、 用无参宏定义一个简单的常量

#define LEN 12

这个是最常见的用法,但也会出错。

比如下面几个知识点你会吗?可以看下:

(1) #define NAME "zhangyuncong"

程序中有"NAME"则,它会不会被替换呢?

(2) #define 0x abcd

可以吗?也就是说,可不可以用把标识符的字母替换成别的东西?

(3) #define NAME "zhang

这个可以吗?

(4) #define NAME "zhangyuncong"

程序中有上面的宏定义,并且,程序里有句:

NAMELIST这样,会不会被替换成"zhangyuncong"LIST

四个题答案都是否定的。

第一个,""内的东西不会被宏替换。这一点应该大都知道。

第二个,宏定义前面的那个必须是合法的用户标识符

第三个,宏定义也不是说后面东西随便写,不能把字符串的两个""拆开。

第四个:只替换标识符,不替换别的东西。NAMELIST整体是个标识符,而没有NAME标识符,所以不替换。

也就是说,这种情况下记住:#define 第一位置第二位置

(1) 不替换程序中字符串里的东西。

(2) 第一位置只能是合法的标识符(可以是关键字)

(3) 第二位置如果有字符串,必须把""配对。

(4) 只替换与第一位置完全相同的标识符

还有就是老生常谈的话:记住这是简单的替换而已,不要在中间计算结果,一定要替换出表达式之后再算。

2、 带参宏一般用法

比如#define MAX(a,b) ((a)>(b)?(a):(b))

则遇到MAX(1+2,value)则会把它替换成:

((1+2)>(value)?(1+2):(value))

注意事项和无参宏差不多。

但还是应注意

#define FUN(a) "a"

则,输入FUN(345)会被替换成什么?

其实,如果这么写,无论宏的实参是什么,都不会影响其被替换成"a"的命运。

也就是说,""内的字符不被当成形参,即使它和一模一样。

那么,你会问了,我要是想让这里输入FUN(345)它就替换成"345"该怎么实现呢?

请看下面关于#的用法

3、 有参宏定义中#的用法

#define STR(str) #str

#用于把宏定义中的参数两端加上字符串的""

比如,这里STR(my#name)会被替换成"my#name"

一般由任意字符都可以做形参,但以下情况会出错:

STR())这样,编译器不会把“)”当成STR()的参数。

STR(,)同上,编译器不会把“,”当成STR的参数。

STR(A,B)如果实参过多,则编译器会把多余的参数舍去。(VC++2008为例)

STR((A,B))会被解读为实参为:(A,B),而不是被解读为两个实参,第一个是(A第二个是B)。 4、 有参宏定义中##的用法

#define WIDE(str) L##str

则会将形参str的前面加上L

比如:WIDE("abc")就会被替换成L"abc"

如果有#define FUN(a,b) vo##a##b()

那么FUN(id ma,in)会被替换成void main()

5、 多行宏定义:

#define doit(m,n) for(int i=0;i<(n);++i)\

{\

m+=i;\

}

‘柒’ TKstudi C编译器怎么设置

VC就很了不起,因为使用这样傻瓜化的工具只能让你看不到事物的本质。接下来我们就来深入的认识Turbo C编译器。 广义的编译器,包括了代码编译器(compiler),目标文件链接器(linker),库文件管理工具(如tc的tlib,gcc的ar),编译驱动工具(如VC的NMake,gcc的make),ANSI c/c++标准的头文件和库文件,扩展的头文件和库文件,集成开发环境(IDE),等等与编译相关的工具,所有这些工具的集合,就组成了广义上的编译器。
狭义的编译器,则仅指compiler。compiler只负责将源代码,即.c/.cxx/.cpp文件编译成为目标文件.o/.obj。编译过程的输入是源文件,包括自己书写的.c和.h以及系统提供的.h文件,编译的输出是目标文件。需要强调的一点时,在compile阶段,只处理源文件,所以不需要库文件和额外的目标文件的参与,因此,只要代码在语法上没有错误,compile就一定能产生目标文件。
对于一个广义的编译器来说以下几个部分是必备的:1.compiler,2.linker,3.系统提供的头文件和库文件。前面已经介绍了compiler,接下来看linker。
linker的功能是将目标文件进行装配,将浮动的地址变为确定的地址,这个工作是通过修改目标文件的重定位项来实现的,其具体的过程可以参考"Linker & loader"这本书,这是一本详细介绍linker和loader的好书,在此做个推荐。总之,link这一阶段处理的输入是目标文件,其输出是可执行文件,或动态库。
任何一个编译器都会提供库文件和与之对应的头文件,C/C++编译器一般都提供ANSI C/C++的库和相应的头文件。
从现在起我们就需要建立起一个概念,就是广义的编译过程,实际上是由编译和链接两个基本步骤组成的,如果能深刻的理解这两个步骤,就是一大进步了。
在编译器里,有一些默认的规定,我们需要了解。在编译器中,bin目录用于存放compiler、linker等工具,include目录用于存放头文件,lib目录用存放库文件,大多数的编译器的目录就是按这个来组织的。
接下来看Turbo C为我们提供了些什么
bin目录中:
CPP.EXE 是一个C语言预处理工具,就是负责对源代码进行预编译处理,不要理解为c++编译器
TCC.EXE 是一个C语言的编译器,可以将代码编译为目标文件,并且能自动调用tlink链接生成可执行文件
TASM.exe 是一个汇编工具,可以将x86的汇编代码编译成为目标文件
TLink.exe 是一个链接器,负责对目标文件、库文件等进行链接
TLib.exe 是一个库文件管理工具,可以将多个目标文件打包到一个库文件里
BGIOBJ.exe 可以将BGI文件转换为.obj文件
make.exe 符合GNU标准的make工具,可用于代码编译的管理
TURBOC.CFG tcc默认的编译参数配置文件
以上所有的工具的使用方法都可以直接键入相应的命令进行查看,如键入tcc即可看到tcc的使用方法,因此这里不再讲解。
BGI目录中:
EGAVGA.BGI 是EGAVGA的bgi驱动
FONT目录中:存放了BGI所使用到的各种字体文件
INCLUDE目录中:是Turbo C的库函数的所有的头文件,当要使用某个库函数时可以在这个目录下搜索,找到其所在文件和原型,这里不在详细叙述。
重点讲一下Lib目录:
init.obj文件是C语言的启动代码,它负责建立C程序运行的堆栈、初始化内存、调用C入口函数等。这部分代码是使用汇编书写的,其源代码可以在TC(官方版)里找到,名称为Init.ASM。
c0t.obj、c0s.obj、c0m.obj、c0c.obj、c0l.obj和c0h.obj文件,都是c code的入口函数实现,入口函数将会读取环境变量,并调用c语言中的main函数,将命令行参数传入main函数中,之后的控制权就交给了main函数,也就是我们常说的C的主函数main。由于Turbo C中有不同的内存模式,因此以上6个文件分别对应TC中6种不同的内存模式。
cc.lib、ch.lib、cl.lib、cm.lib、cs.lib五个文件都是TC提供的ANSI C标准库的库文件,分别对用不同的内存模式:
cc compact模式
ch huge模式
cl large模式
cm medium模式
cs small模式

‘捌’ window内自带的C语言编译器怎么用

1、首先,输入【#include】。


注意事项:

尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。

‘玖’ c语言 怎么在CMD下运行编译器,想查看扩展后的宏,

cl source_file。如果不能使用这个命令可能是没有设置路径。搜索出来路径添加就好了。至于命令中定义宏我不清楚。linux中是gcc -g -o resultname -Ddefinename='' sourcefile 。其中-g是调用调试器,-o是定义编译后生成的可执行性文件名,如果没有此选项会生成名为a.out的文件。-D命令是定义宏,引号中是宏的内容。最后要加上源文件的名字。linux中还有很多工具编写程序。如果你喜欢使用命令行可以试试linux,你会发现它很有趣

‘拾’ window内自带的C语言编译器怎么用

1。turbo c 比较实用的编译器
按f10,用方向键选择最左边file,点回车键出现下拉菜单,选择第一个,把里面的内容全删了然后输入x:\(x为源文件所在盘),找到源文件,回车键打开。
然后再按f10,选择run或单击r运行,或者直接按f9编译,编译后的文件在turbo c 所在文件夹的 out put文件夹里面。
2。visual c++事实上这不只是单纯的编译器,应该说是开发环境,但包含有编译功能,直接鼠标操作就可以了。

热点内容
pythonjson格式 发布:2025-07-15 08:42:54 浏览:675
医院药房要什么配置 发布:2025-07-15 08:29:55 浏览:663
编程说明书 发布:2025-07-15 08:16:39 浏览:759
android请求超时 发布:2025-07-15 07:56:57 浏览:528
修改linux的主机名 发布:2025-07-15 07:52:46 浏览:905
天龙八部自动挖矿脚本怎么写 发布:2025-07-15 07:42:01 浏览:648
本地编译器怎么运行 发布:2025-07-15 07:42:00 浏览:995
加密狗会坏吗 发布:2025-07-15 07:38:32 浏览:563
jdbc读取数据库 发布:2025-07-15 07:38:23 浏览:322
华为手机如何设置隐私密码锁 发布:2025-07-15 07:36:09 浏览:980