gcc 使用说明

合集下载

C语言编译器MINGW的使用说明

C语言编译器MINGW的使用说明

在mingw环境中生成和使用dll都是十分方便的。

1.生成dllgcc(g++) -shared -o test.dll test.c一直用VS,看现在Eclipse很火,便想弄一下玩玩,用到了MINGW,继而用到了GCC,对GCC相当的不熟悉,从头开始学一些简单的吧。

简单的GCC用法~gcc命令提供了非常多的命令选项,但并不是所有都要熟悉,初学时掌握几个常用的就可以了,到后面再慢慢学习其它选项,免得因选项太多而打击了学习的信心。

一.常用编译命令选项假设源程序文件名为test.c。

1.无选项编译链接用法:#gcc test.c作用:将test.c预处理、汇编、编译并链接形成可执行文件。

这里未指定输出文件,默认输出为a.out。

编译成功后可以看到生成了一个a.out的文件。

在命令行输入./a.out执行程序。

./表示在当前目录,a.out为可执行程序文件名。

2.选项-o用法:#gcc test.c -o test作用:将test.c预处理、汇编、编译并链接形成可执行文件test。

-o选项用来指定输出文件的文件名。

输入./test执行程序。

3.选项-E <大写,注意>用法:#gcc -E test.c -o test.ior作用:将test.c预处理输出test.i文件。

4.选项-S <大写,注意>用法:#gcc -S test.i作用:将预处理输出文件test.i汇编成test.s文件。

5.选项-c用法:#gcc -c test.s作用:将汇编输出文件test.s编译输出test.o文件。

6.无选项链接用法:#gcc test.o -o test作用:将编译输出文件test.o链接成最终可执行文件test。

输入./test执行程序。

7.选项-O用法:#gcc -O1 test.c -o test作用:使用编译优化级别1编译程序。

级别为1~3,级别越大优化效果越好,但编译时间越长。

GCC常见参数配置

GCC常见参数配置

GCC常见参数配置简介gcc 和 g++现在是gnu中最主要和最流⾏的c & c++编译器 .gcc/g++在执⾏编译⼯作的时候,总共需要以下⼏步:1.预处理,⽣成.i的⽂件[预处理器cpp]2.将预处理后的⽂件不转换成汇编语⾔,⽣成⽂件.s[编译器egcs]3.有汇编变为⽬标代码(机器代码)⽣成.o的⽂件[汇编器as]4.连接⽬标代码,⽣成可执⾏程序[链接器ld]GCC能够处理的后缀有:a. *.c *.C (C语⾔)b. *.cxx *.cc (C++语⾔)c. *.m (⾯向对象的C)d. *.i (预处理后的C语⾔源⽂件)e. *.ii (预处理后的C++语⾔源⽂件)f. *.s *.S (汇编语⾔)h. *.h (头⽂件)⽬标⽂件可以是:1. *.o 编译连接后的⽬标⽂件2. *.a 库⽂件gcc与g++有什么区别共同点: gcc和g++都是GNU(组织)的⼀个编译器。

误区⼀:gcc只能编译c代码,g++只能编译c++代码1.后缀为.c的,gcc把它当作是C程序,⽽g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。

C++的语法规则更加严谨⼀些。

2.编译阶段,g++会调⽤gcc,对于c++代码,两者是等价的,但是因为gcc命令不能⾃动和C++程序使⽤的库联接,所以通常⽤g++来完成链接,为了统⼀起见,⼲脆编译/链接统统⽤g++了,这就给⼈⼀种错觉,好像cpp程序只能⽤g++似的。

误区⼆:gcc不会定义__cplusplus宏,⽽g++会实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采⽤gcc编译器,则该宏就是未定义的,否则,就是已定义。

误区三:编译只能⽤gcc,链接只能⽤g++严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以⽤gcc/g++,⽽链接可以⽤g++或者gcc -lstdc++。

GCC库函数

GCC库函数

如何使用A VR-GCC 安装GNU C for A VR一.执行安装程序二.生成链接用的库文件$(A VR)表示安装的根目录。

(在本人系统里为f:\avrgcc)生成库文件关键是要运行位于$(A VR)下的RUN.BAT。

原程序如下: @echo offif NOT %A VR%!==! goto installrem set environment variablesset A VR=f:\A VRGCCset CC=avr-gccset PATH=.;f:\A VRGCC\bin;%path%doskey:installif %1!==! GOTO endrem install libccd f:\A VRGCC\lib\avr-libc-20010701\srcrem first win32_make_dirs will make some errors(I don't know why?) make -f makefile-win32 win32_make_dirsmake -f makefile-win32make -f makefile-win32 installmake -f makefile-win32 clean:endf:cd f:\A VRGCCmode con: lines=43要修改为:@echo offif NOT %A VR%!==! goto installrem set environment variablesset A VR=f:\A VRGCCset CC=avr-gccrem set PATH=.;f:\A VRGCC\bin;%path%doskey:installrem if %1!==! GOTO endrem install libccd f:\A VRGCC\lib\avr-libc-20010701\srcrem first win32_make_dirs will make some errors(I don't know why?) f:\A VRGCC\bin\make -f makefile-win32 win32_make_dirsf:\A VRGCC\bin\make -f makefile-win32f:\A VRGCC\bin\make -f makefile-win32 installf:\A VRGCC\bin\make -f makefile-win32 clean:endf:cd f:\A VRGCCmode con: lines=43在以后的应用中,运行的是修改之前的RUN.BAT,但要去掉rem if %1!==! GOTO end的“rem”。

gcov,lcov,genhtml使用方法

gcov,lcov,genhtml使用方法

gcc是linux平台下的C、C++ 编译器gcov是配合gcc产生覆盖信息报告的工具;lcov是将gcov产生的报告信息,以更直观的方式显示出来工具基本的使用方法分为4个阶段:(一)、gcc编译:产生插装后的目标文件test、gcov结点文件test.gcno#gcc -fprofile-arcs -ftest-coverage -o test test.c# lstest test.c test.gcno说明:参数fprofile-arcs和ftest-coverage告诉gcc编译器:(1)在目标文件test 插装跟踪代码;(2)生成供gcov使用test.gcno [gcov node 文件]。

因此,这里的生成的目标文件比正常编译的文件大。

(二)、运行目标文件:收集运行覆盖信息test.gcda# ./testSuccess -- 这里是运行结果。

# lstest test.c test.gcno test.gcda这里test.gcda运行结果,(三)、gcov产生报告信息:test.c.gcov#gcov test.cFile 'test.c'Lines executed: 87.50% of 8test.c: creating 'test.c.gcov'#lstest test.c test.c.gcov test.gcda test.gcno(四)、lcov:格式化test.c.gcov,输出到文件#lcov -d . -t 'test' -o '' -b . -c说明:-d . :参数d指路径,"." 指当前路径-t "name" :指目标文件,这里是test-o "filename" :输出格式化后的信息文件名(五)、genhtml:根据信息文件(.info)产生html 文档,输出到一个文件夹中#genhtml -o result 说明: -o directory :参数o (output)后面跟路径名称,在当前目录下创建指定目录,本例中是result至此:可以在result目录中打开index.html 浏览覆盖信息。

gcc汽车认证法规-概述说明以及解释

gcc汽车认证法规-概述说明以及解释

gcc汽车认证法规-概述说明以及解释1.引言1.1 概述GCC汽车认证法规是指海湾合作委员会(GCC)国家间对汽车认证的一套标准和要求。

为了促进海湾地区汽车贸易和保障汽车安全,GCC成员国制定了一系列的法规和准则,对汽车的设计、生产、质量控制、安全与环保等方面进行规范和监管。

这些法规体现了GCC成员国对汽车行业的重视和对消费者权益的保护。

它们的制定旨在确保销往GCC市场的汽车符合高质量和安全标准,并促进汽车市场的竞争与发展。

通过对汽车认证的管理,GCC国家能够建立起一个公平、透明和可靠的汽车市场,为消费者提供更好的选择和服务。

尽管GCC国家的汽车认证法规在一些方面存在差异,但是它们都基于共同的原则和目标。

认证法规主要关注以下几个方面:汽车的安全性能、排放和环保要求、车辆的质量控制、产品标识和合规性检测等。

这些要求旨在确保汽车制造商遵守相关的技术标准和规范,在生产和销售过程中保证汽车的质量、安全和环保符合国际标准。

GCC汽车认证法规对于GCC成员国的汽车制造商和进口商来说是必须遵守的,它们需要通过相关的认证程序和检测,以确保其产品符合法规的要求。

只有通过认证的汽车才能销售和上市,否则将面临被禁止销售或受到处罚的风险。

通过GCC汽车认证法规的实施,GCC成员国能够建立起一个统一的汽车市场,加强对汽车质量和安全的监管控制,并提高消费者的购车信心和保障其权益。

随着海湾地区汽车市场的快速发展和竞争的加剧,GCC汽车认证法规也将不断更新和完善,以适应市场的需求和对汽车行业的要求。

1.2 文章结构文章结构部分的内容如下所示:文章结构本文按照以下结构进行组织。

首先,引言部分(第1节)将对GCC汽车认证法规进行概述,并介绍文章的整体结构。

其次,正文部分(第2节)将详细讨论GCC汽车认证法规的概述、要点一和要点二。

最后,结论部分(第3节)将总结GCC汽车认证法规,并展望其未来发展,并以结束语结束全文。

引言部分将以对GCC汽车认证法规的概述为开头,通过简要介绍该法规的背景和意义来引发读者的兴趣。

欧盟的ce标准和中东gcc组织的g-mark标准-解释说明

欧盟的ce标准和中东gcc组织的g-mark标准-解释说明

欧盟的ce标准和中东gcc组织的g-mark标准-概述说明以及解释1.引言1.1 概述概述部分是文章引言的一部分,主要目的是简要介绍文章的主题和内容,让读者对文章有一个初步的了解。

在撰写概述部分时,可以从以下几个方面展开讨论:欧盟的CE标准和中东GCC组织的G-mark标准是两个重要的产品合规标准,在国际贸易中扮演着重要的角色。

CE标准是指欧洲共同体标志,在欧洲国家是必需的,而G-mark标准则为中东地区的国家提供了一致的合规要求。

本文旨在比较和分析这两个标准的异同,并探讨其在产品贸易中的应用和影响。

通过对CE标准和G-mark标准的定义、背景、制定过程、应用范围以及标准互认等方面进行探讨,可以更好地理解这两个标准的实质和作用。

在比较欧盟CE标准和中东GCC组织的G-mark标准时,将会对标准的内容和要求、适用范围和地区差异,以及标准的互认和合作等方面进行深入分析。

通过对这些方面的比较,可以帮助读者更好地理解这两个标准之间的异同和相互影响。

最后,文章将通过总结CE标准和G-mark标准的异同,并展望标准的发展趋势和对国际贸易和产品安全的重要性进行思考,以期提供对于未来标准合规的思考和指导。

通过本文的撰写,希望能够为读者更好地了解和应用CE标准和G-mark标准提供有价值的信息和观点。

让我们一起深入探讨这两个标准,并为国际贸易和产品合规做出积极的贡献。

文章结构的主要内容如下:第一部分:引言1.1 概述:介绍欧盟的CE标准和中东GCC组织的G-mark标准的背景和重要性。

1.2 文章结构:概述文章的整体结构和各个部分的内容和逻辑关系。

1.3 目的:明确本文的研究目的和意义。

1.4 总结:对引言部分进行总结。

第二部分:欧盟的CE标准2.1 CE标准的定义和背景:介绍CE标准的来源、定义、目的和相关法律法规。

2.2 CE标准的制定过程:解析CE标准的制定流程,包括欧盟的参与机构、标准的制定流程和流程的具体步骤。

GCCT-G直流充电机特性测试仪仪器使用说明书

GCCT-G直流充电机特性测试仪仪器使用说明书

GCCT-G直流充电机特性测试仪仪器使用说明书Ver:3.0.00上海冠测电气科技有限公司目录一、概述 (2)1.1 用途 (2)1.2 功能 (2)1.3 特点 (3)1.4 技术指标 (4)1.5 内存使用说明 (4)二、仪器结构 (5)2.1 整体结构 (5)2.2 主要部件 (5)三、连接 (7)3.1 准备 (7)3.2 主机连接 (7)3.2.1 红黑电缆连接 (8)3.2.2 电压测试线连接 (8)3.3 直流电源测试 (8)四、功能操作 (9)4.1 综合测试 (9)4.2 稳压测试 (11)4.3 稳流测试 (13)4.4 纹波测试 (15)4.5 电阻负载 (17)4.6 调压器调压 (17)4.7 数据管理 (18)4.8 系统设置 (19)4.8.1 时间设置 (19)4.8.2 调压器设置 (19)4.8.3 零点校准 (19)4.8.4 增益校准 (19)4.8.5 MOS管校准 (20)4.8.6 参数保存 (20)4.9 版本信息 (20)五、日常维护 (21)六、常见问题解答 (21)一、概述1.1 用途DL/T 724-2000《电力系统用蓄电池直流电源装置运行与维护技术规程》第5.3条中,GB/T19826-2005《电力工程直流电源设备通用技术条件和安全要求》第5.2条中及6.3条中,对充电装置的稳压精度、稳流精度、纹波系数、充电机效率等技术指标及试验方法有明确的规定及技术要求。

试验内容主要是通过调压装置(如变压器)将充电机交流输入电压在额定电压±10%内变化,通过负载调整装置(如放电电阻),使充电机的直流输出电压及输出电流在规定范围内变化(电压调整范围为额定值的90%~115%,电流调整范围为额定值的0~100%),在调整范围内测量电压、电流及纹波值,通过计算,得到充电机的稳压精度、稳流精度及纹波系数、充电机效率等。

充电机特性测试仪是根据国家关于直流电源运行和维护规程的相关要求而派生的一个产品,主要包含稳压精度测量、稳流精度测量、纹波系数测量等功能,同时配备充电机特性测试仪数据分析软件,对上传至计算机的测量数据进行各种分析。

海尔家用空调KFR-72GW 03EAF13 KFR-72GW 03GCC12 说明书

海尔家用空调KFR-72GW 03EAF13 KFR-72GW 03GCC12 说明书

1注意事项(使用前请先阅读)2各部分构件名称电池的安装两节R-03(7号)电池首次开机和更换电池后需校准时钟,校准方法为注:机器外观以实物为准。

出风口进风口负离子发生器(内部)竖摆叶(内部)左右风向调节显示面板导风板上下风向调节进风栅过滤网(内部)进风口排水管出风口连接管和电气接线按 键确定时间后,按 键●123时钟设定按时间调节键调节时间,每按一次,增加或减少1分钟,按住不放将快速增加或减少。

时钟显示“AM”或“PM”闪烁。

●“AM”或“PM”不再闪烁,时钟开始走时。

1234取下电池盒盖装入电池重新装好电池盒盖核定显示确认盒底部图示“ ”、“ ”极要求。

若按下开/关键后无显示,则重新装一下电池。

机器外观以实物为准空调器运行操作范围制 冷除 湿室 内 侧室 外 侧室 内 侧室 外 侧最 高最 低最 高最 低最 高最 低最 高最 低干球: 32℃干球: 18℃干球: 43℃干球: 18℃干球: 27℃干球: 15℃干球: 24℃干球: -7℃湿球: 23℃湿球: 14℃湿球: 26℃湿球: 18℃湿球: -8℃制 热注:在以上条件下使用,临近制冷最高温度时,制冷效果会有所下降 (可采用遮阳措施避免阳光直射);临近制热最低温度时,制热效 果会有所下降。

注:本公司注重科技更新,参数更改后,恕不另行通知。

以上数据在国家规定的标准工况即:制冷工况为室内干球27℃、 湿球19℃,室外干球35℃、湿球24℃;制热工况为室内干球20℃、 湿球15℃,室外干球7℃、湿球6℃;电压220V ~的条件下测得。

随着室内外气温的变化,以上参数会有所变化。

凡带有该“警示”标志的内容,有关产品安全和使用者的人身安全,必须严格按警示的内容操作。

凡带有该“禁止”标志的内容,是必须绝对禁止的行为,否则可能会造成机器的损坏或危及使用者的人身安全。

禁止警示修理内容及确认对于超过保修期的产品,海尔服务人员上门提供有偿服务,有偿费用(超包收费)包括修理人工费、零部件费和超距离交通费。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

GCC rules你能想象使用封闭源代码的私有编译器编译自由软件吗?你怎么知道编译器在你的可执行文件中加入了什么?可能会加入各种后门和木马。

Ken Thompson是一个著名的黑客,他编写了一个编译器,当编译器编译自己时,就在'login'程序中留下后门和永久的木马。

请到这里阅读他对这个杰作的描述。

幸运的是,我们有了gcc。

当你进行configure; make; make install 时,gcc在幕后做了很多繁重的工作。

如何才能让gcc为我们工作呢?我们将开始编写一个纸牌游戏,不过我们只是为了演示编译器的功能,所以尽可能地精简了代码。

我们将从头开始一步一步地做,以便理解编译过程,了解为了制作可执行文件需要做些什么,按什么顺序做。

我们将看看如何编译C程序,以及如何使用编译选项让gcc按照我们的要求工作。

步骤(以及所用工具)如下:预编译(gcc -E),编译(gcc),汇编(as),和连接(ld)。

开始...首先,我们应该知道如何调用编译器。

实际上,这很简单。

我们将从那个著名的第一个C 程序开始。

(各位老前辈,请原谅我)。

#include <stdio.h>int main(){printf("Hello World!\n");}把这个文件保存为game.c。

你可以在命令行下编译它:gcc game.c在默认情况下,C编译器将生成一个名为a.out 的可执行文件。

你可以键入如下命令运行它:a.outHello World每一次编译程序时,新的a.out 将覆盖原来的程序。

你无法知道是哪个程序创建了a.out。

我们可以通过使用-o 编译选项,告诉gcc我们想把可执行文件叫什么名字。

我们将把这个程序叫game,我们可以使用任何名字,因为C没有Java那样的命名限制。

gcc -o game game.cgameHello World到现在为止,我们离一个有用的程序还差得很远。

如果你觉得沮丧,你可以想一想我们已经编译并运行了一个程序。

因为我们将一点一点为这个程序添加功能,所以我们必须保证让它能够运行。

似乎每个刚开始学编程的程序员都想一下子编一个1000行的程序,然后一次修改所有的错误。

没有人,我是说没有人,能做到这个。

你应该先编一个可以运行的小程序,修改它,然后再次让它运行。

这可以限制你一次修改的错误数量。

另外,你知道刚才做了哪些修改使程序无法运行,因此你知道应该把注意力放在哪里。

这可以防止这样的情况出现:你认为你编写的东西应该能够工作,它也能通过编译,但它就是不能运行。

请切记,能够通过编译的程序并不意味着它是正确的。

下一步为我们的游戏编写一个头文件。

头文件把数据类型和函数声明集中到了一处。

这可以保证数据结构定义的一致性,以便程序的每一部分都能以同样的方式看待一切事情。

#ifndef DECK_H#define DECK_H#define DECKSIZE 52typedef struct deck_t{int card[DECKSIZE];/* number of cards used */int dealt;}deck_t;#endif /* DECK_H */把这个文件保存为deck.h。

只能编译.c 文件,所以我们必须修改game.c。

在game.c的第2行,写上#include "deck.h"。

在第5行写上deck_t deck;。

为了保证我们没有搞错,把它重新编译一次。

gcc -o game game.c如果没有错误,就没有问题。

如果编译不能通过,那么就修改它直到能通过为止。

预编译编译器是怎么知道deck_t 类型是什么的呢?因为在预编译期间,它实际上把"deck.h"文件复制到了"game.c"文件中。

源代码中的预编译指示以"#"为前缀。

你可以通过在gcc后加上-E 选项来调用预编译器。

gcc -E -o game_precompile.txt game.cwc -l game_precompile.txt3199 game_precompile.txt几乎有3200行的输出!其中大多数来自stdio.h 包含文件,但是如果你查看这个文件的话,我们的声明也在那里。

如果你不用-o 选项指定输出文件名的话,它就输出到控制台。

预编译过程通过完成三个主要任务给了代码很大的灵活性。

把"include"的文件拷贝到要编译的源文件中。

用实际值替代"define"的文本。

在调用宏的地方进行宏替换。

这就使你能够在整个源文件中使用符号常量(即用DECKSIZE表示一付牌中的纸牌数量),而符号常量是在一个地方定义的,如果它的值发生了变化,所有使用符号常量的地方都能自动更新。

在实践中,你几乎不需要单独使用-E 选项,而是让它把输出传送给编译器。

编译作为一个中间步骤,gcc把你的代码翻译成汇编语言。

它一定要这样做,它必须通过分析你的代码搞清楚你究竟想要做什么。

如果你犯了语法错误,它就会告诉你,这样编译就失败了。

人们有时会把这一步误解为整个过程。

但是,实际上还有许多工作要gcc去做呢。

汇编as 把汇编语言代码转换为目标代码。

事实上目标代码并不能在CPU上运行,但它离完成已经很近了。

编译器选项-c 把.c 文件转换为以.o 为扩展名的目标文件。

如果我们运行gcc -c game.c我们就自动创建了一个名为game.o的文件。

这里我们碰到了一个重要的问题。

我们可以用任意一个.c 文件创建一个目标文件。

正如我们在下面所看到的,在连接步骤中我们可以把这些目标文件组合成可执行文件。

让我们继续介绍我们的例子。

因为我们正在编写一个纸牌游戏,我们已经把一付牌定义为deck_t,我们将编写一个洗牌函数。

这个函数接受一个指向deck类型的指针,并把一付随机的牌装入deck类型。

它使用'drawn' 数组跟踪记录那些牌已经用过了。

这个具有DECKSIZE个元素的数组可以防止我们重复使用一张牌。

#include <stdlib.h>#include <stdio.h>#include <time.h>#include "deck.h"static time_t seed = 0;void shuffle(deck_t *pdeck){/* Keeps track of what numbers have been used */int drawn[DECKSIZE] = {0};int i;/* One time initialization of rand */if(0 == seed){seed = time(NULL);srand(seed);}for(i = 0; i < DECKSIZE; i++){int value = -1;do{value = rand() % DECKSIZE;}while(drawn[value] != 0);/* mark value as used */drawn[value] = 1;/* debug statement */printf("%i\n", value);pdeck->card[i] = value;}pdeck->dealt = 0;return;}把这个文件保存为shuffle.c。

我们在这个代码中加入了一条调试语句,以便运行时,能输出所产生的牌号。

这并没有为我们的程序添加功能,但是现在到了关键时刻,我们看看究竟发生了什么。

因为我们的游戏还在初级阶段,我们没有别的办法确定我们的函数是否实现了我们要求的功能。

使用那条printf语句,我们就能准确地知道现在究竟发生了什么,以便在开始下一阶段之前我们知道牌已经洗好了。

在我们对它的工作感到满意之后,我们可以把那一行语句从代码中删掉。

这种调试程序的技术看起来很粗糙,但它使用最少的语句完成了调试任务。

以后我们再介绍更复杂的调试器。

请注意两个问题。

我们用传址方式传递参数,你可以从'&'(取地址)操作符看出来。

这把变量的机器地址传递给了函数,因此函数自己就能改变变量的值。

也可以使用全局变量编写程序,但是应该尽量少使用全局变量。

指针是C的一个重要组成部分,你应该充分地理解它。

我们在一个新的.c 文件中使用函数调用。

操作系统总是寻找名为'main'的函数,并从那里开始执行。

shuffle.c 中没有'main'函数,因此不能编译为独立的可执行文件。

我们必须把它与另一个具有'main'函数并调用'shuffle'的程序组合起来。

运行命令gcc -c shuffle.c并确定它创建了一个名为shuffle.o 的新文件。

编辑game.c文件,在第7行,在deck_t类型的变量deck 声明之后,加上下面这一行:shuffle(&deck);现在,如果我们还象以前一样创建可执行文件,我们就会得到一个错误gcc -o game game.c/tmp/ccmiHnJX.o: In function `main':/tmp/ccmiHnJX.o(.text+0xf): undefined reference to `shuffle'collect2: ld returned 1 exit status编译成功了,因为我们的语法是正确的。

但是连接步骤却失败了,因为我们没有告诉编译器'shuffle'函数在哪里。

那么,到底什么是连接?我们怎样告诉编译器到哪里寻找这个函数呢?连接连接器ld,使用下面的命令,接受前面由as 创建的目标文件并把它转换为可执行文件gcc -o game game.o shuffle.o这将把两个目标文件组合起来并创建可执行文件game.连接器从shuffle.o目标文件中找到shuffle 函数,并把它包括进可执行文件。

目标文件的真正好处在于,如果我们想再次使用那个函数,我们所要做的就是包含"deck.h" 文件并把shuffle.o 目标文件连接到新的可执行文件中。

象这样的代码重用是经常发生的。

虽然我们并没有编写前面作为调试语句调用的printf 函数,连接器却能从我们用#include <stdlib.h> 语句包含的文件中找到它的声明,并把存储在C库(/lib/libc.so.6)中的目标代码连接进来。

这种方式使我们可以使用已能正确工作的其他人的函数,只关心我们所要解决的问题。

相关文档
最新文档