目录
一.gcc编译C语言程序
二.makefile编译C语言程序
三.编译过程中遇到的问题
题目:编写一个主程序文件main1.c和一个子程序文件sub1.c,有如下要求:子程序sub1.c包含一个算术运算函数float x2x(int a,int b),此函数功能为对两个输入整型参数做某个运算,将结果做浮点数返回;主程序main1.c定义并赋值两整型变量,然后调用函数x2x,将x2x的返回结果printf出来。(1)请在ubuntu系统中用gcc命令行方式编译主程序main1.c并运行;(2)请在windows系统下用你熟悉的编译工具编译主程序main1.c并运行;(3)在ubuntu系统下用makefile方式编译主程序。
一.gcc编译c语言程序
1.用vim创建main1.c文件:
2.进入vim编辑器然后输入"i"进入编辑模式,main1.c主程序的代码内容如下:
3.主程序的代码完成后按Esc键返回普通模式,并在命令行中输入“:wq"并回车,这样能够退出并保存主程序的vim编辑界面
4.用vim创建sub1.c文件:
5.进入vim编辑器然后输入"i"进入编辑模式,sub1.c子程序的代码内容如下:
6.子程序的代码完成后按Esc键返回普通模式,并在命令行中输入“:wq"并回车,这样能够退出并保存子程序的vim编辑界面
7.使用gcc转化为可执行文件:
注意:gcc 编译文件的具体过程是:源文(.c)---->目标文件(.o)---->可执行文件
8.运行生成的main1可执行文件:
9.运行结果如下所示:
10.windows下用IDE执行相同的C程序,结果如下所示:
二.makefile编译C语言程序
1.用vim创建makefile文件
2.进入vim编辑器然后输入"i"进入编辑模式,makefile程序的代码内容如下:
3.同样地,按Esc退出编辑模式,并在命令行处输入":wq"再回车以保存并退出vim编辑界面
4.输入make:
5.然后会得到makefile的运行结果:
6.再输入makefile中all的可执行文件:
7.最后得到程序的运行结果:
三.编译过程中遇到的问题
原因:分隔符要使用Tab键,而不是自行输入空格
原因:命名的all文件与现目录中的文件重名
解决方法:在makefile文件中加入“.PHONY:all"
3
原因:重复定义了某一函数,本例中显示的是:“x2x"函数
通过搜集一些资料,看到有如下解释可以帮助我们很好地理解:
“一般在.h文件中应以一个变量或函数声明时,在其他文件中只要包含了这个.h文件,编译的时候就会独立被编译器解释,然后每个.c文件会产生独立的标识符和符号表,所以上述代码在单独编译的时候不会报错,语法是合法的。但是,最后在编译器链接的时候,就会将工程中的所有符号整合在一起,由于文件中有重复的变量或函数,于是就会出现重复定义的错误,系统给你的提示就是:multiple definiton of ‘xx’”
解决方法:在主程序中不再引用子程序,而是直接定义在子程序中被引用的方法即可