Linux下C程序的编写
练习使用gcc 编译器编译C 程序并执行,编写Makefile文件,使用make 工具编译程序并执行
具体要求:
(1)编写简单的C 程序,功能为在屏幕上输出“Hello gcc!”。利用该程序练习使用gcc 编译器的E、S、c、o、g 选项,观察不同阶段所生成的文件,即*.c、.i、.s、*.o 文件和可执行文件。
(2)编写一个由头文件greeting.h、自定义函数文件greeting.c、主函数文件myapp.c 构成的C 程序,并根据这三个文件的依赖关系编写Makefile 文件
请上传源代码以及程序运行的结果截图。
如果你是来抄作业的上面部分跳过
操作系统的作业为啥要写这个啊. (老师还不讲QAQ
既然老师不讲,那么我们只能自力更生了. 第一小问很简单, 不做讲解. 重点在第二问的Makefile文件的书写.
应题目要求先编写头文件greeting.h 和 自定义函数文件greeting.c.
我们需要知道的硬性知识是如何编写C语言头文件. (先给代码,想学的在后面补充.
greeting.h:
#ifndef _GREETING_H
#define _GREETING_H
#include<stdio.h>
extern void fun1(void);
extern void fun2(void);
#endif
greeting.c:
#include "greeting.h"
void fun1(void){ printf("your name, please!\n"); }
void fun2(void){ printf("gcc~\n"); }
上面是编写了我们自己的头文件,该头文件中包含我们定义的两个函数,可以直接使用.之后我们需要编写一个C语言程序来运行使用它.即myapp.c文件.
myapp.c
#include "greeting.h"
int main(void){
fun1();
fun2();
return 0;
}
现在我们的C语言程序已经写好了,有以上代码,你在C语言编辑器中是可以运行的. 如果不进行C语言编辑器的运行,我们应该如何得到结果? 这就是需要我们的Makefile文件了. 先直接给出代码.
myapp: greeting.o myapp.o
gcc myapp.o greeting.o -o myapp
greeting.o: greeting.c greeting.h
gcc -c greeting.c
myapp.o: myapp.c greeting.h
gcc -c myapp.c
clean:
rm rf *.o
在终端中执行make语句,得到的myapp文件,再运行得到结果为:
your name, please!
gcc~
为了写作业的同学看到这里就行了
下面先讲解一下C语言头文件的书写.
*.h 文件具有固定的模板,你唯一要做的就是取个名字.
#ifndef _GREETING_H // *.h的文件名,文件名前加_ ,并且点换成_
#define _GREETING_H // 书写方法同上
auto function() {};
#endif
*.c文件的书写. 应为这两个文件是一个整体,设置相同的名字更好一些.
当然你在 *.c文件中书写的函数名是要能对应 *.h文件中的. 例如:
#include "greeting.h" //你首先要和 *.h文件链接
//书写对应的函数
auto function() {};
//当然你书写的函数如果用到printf等需要引用对应的头文件.
//你可以写在*.c文件中,也可以写在*.h文件中.
之后通过 #include" .h " 直接引用即可.
这里是应题目要求. 你也可以将 ‘.c’ 文件中的函数直接写在 ‘*.h’ 中,在Linux ubuntu相同的目录下,可以直接引用并编译。
gcc myapp.c
关于Makefile部分:(只涉及书写运行C语言的makefile书写
书写的Makefikle实际上就是做了我们下载的编辑器做的事情. 在一个C语言程序的运行时,需要生成一系列的 *.o文件.
首先将我们的C语言程序进行gcc编译. 假设文件名为myapp.c
myapp.o: myapp.c
gcc -c myapp.c
第一行表示我们要生成 myapp.o 文件,并且我们需要用到的时 myapp.c 文件.
第二行表示我们要执行的操作是对 myapp.c 文件的 gcc 环境下的编译.
有了 *.o 的文件我们才可以生成能得到运行结果的文件. 这个文件你可以任意取名.
name: myapp.o
gcc myapp.o -o name
将以上代码合并,就是执行名为 myapp.c 的C语言程序后的执行文件name.
name: myapp.o
gcc myapp.o -o name
myapp.o: myapp.c
gcc -c myapp.c
clean:
rm rf *.o
ps:因为是自学的,可能会有些专业术语用错.
--over
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/