学习c语言遇到的一些问题(2)(Linux)(makefile)
2016-01-06 19:55
483 查看
第二个问题是关于makefie的。众所周知,使用makefile可以对多个源文件进行编译,非常的方便简捷。但是在学习的过程
中我遇到了一些小问题。使用makefile和在主函数所在的文件直接incldue其他文件有什么区别呢?
首先先举两个例子
第一个例子:
file1.c:
file2.c:
makefile文件
显然第一个例子是可以运行的
第二个例子:
file1.c
#include
#include"file2.c"
int g=3;
int main(void){
int s,y;
s=g*g*g;
y=sum(g,s);
printf("%d%d\n",s,y);}
file2.c
#include
int sum(int e,int f)
{return e+f;}
相同如果仍然用上面的makefile文件,便不会运行成功程序会报错说:
gcc -cfile1.c
gcc file1.o file2.o -o file12
file2.o:在函数‘sum’中:
file2.c:(.text+0x0): multiple definition of `sum'
file1.o:file1.c:(.text+0x0):第一次在此定义
collect2: 错误:ld 返回 1
make: *** [file12] 错误 1
在查找了资料后,我终于明白了这个问题。
首先,只要是一个c语言源文件,不管源代码中是不是存在错误都可以生成它对应的目标文件。
在linux上编写程序时,可以使用makefile来完成一个工程的编译。这时需要分为好几步。
通常我们将相关功能的函数组织在一个文件中形成属于项目的函数库,每个文件gcc-c编译为独立的.o目标文件,最后统一
链接生成可执行文件。
而正是在链接这一步起到了作用,即使在主函数所在文件中没有include其他文件,但是已经把各个文件链接在了一起,同样能够生成可执行文件。
如果不使用makefile的话,就需要对主函数存在的文件开头中加上include所调用函数所在的文件,这样才能使编译不报错。
而在例二中,使用make命令后就已经对该文件进行了链接,所以在文件开头处可以用再incldue其他的文件,否则将是重复
的定义。
中我遇到了一些小问题。使用makefile和在主函数所在的文件直接incldue其他文件有什么区别呢?
首先先举两个例子
第一个例子:
file1.c:
#include "stdio.h" void main() { int a; printf("please input the number:\n"); scanf("%d",&a); printf("square(a)=%d\n",square(a)); }
file2.c:
#include "stdio.h" int square(int x) { return x*x; }
makefile文件
显然第一个例子是可以运行的
第二个例子:
file1.c
#include
#include"file2.c"
int g=3;
int main(void){
int s,y;
s=g*g*g;
y=sum(g,s);
printf("%d%d\n",s,y);}
file2.c
#include
int sum(int e,int f)
{return e+f;}
相同如果仍然用上面的makefile文件,便不会运行成功程序会报错说:
gcc -cfile1.c
gcc file1.o file2.o -o file12
file2.o:在函数‘sum’中:
file2.c:(.text+0x0): multiple definition of `sum'
file1.o:file1.c:(.text+0x0):第一次在此定义
collect2: 错误:ld 返回 1
make: *** [file12] 错误 1
在查找了资料后,我终于明白了这个问题。
首先,只要是一个c语言源文件,不管源代码中是不是存在错误都可以生成它对应的目标文件。
在linux上编写程序时,可以使用makefile来完成一个工程的编译。这时需要分为好几步。
通常我们将相关功能的函数组织在一个文件中形成属于项目的函数库,每个文件gcc-c编译为独立的.o目标文件,最后统一
链接生成可执行文件。
而正是在链接这一步起到了作用,即使在主函数所在文件中没有include其他文件,但是已经把各个文件链接在了一起,同样能够生成可执行文件。
如果不使用makefile的话,就需要对主函数存在的文件开头中加上include所调用函数所在的文件,这样才能使编译不报错。
而在例二中,使用make命令后就已经对该文件进行了链接,所以在文件开头处可以用再incldue其他的文件,否则将是重复
的定义。
相关文章推荐
- Linux tty驱动学习 - UART驱动的write操作流程
- Red Hat Enterprise Linux 系统服务管理
- Linux 线程管理
- Linux超级守护进程——xinetd
- Install FFMPEG and FFMPEG-PHP in CentOS 6 with Virtualmin
- ppp在linux下的编译和安装
- 在ARM Linux下使用GPIO模拟SPI时序详解
- Linux 系统应用编程——进程基础
- 定制属于自己的自动化安装的linux系统镜像
- linux下rsync的用法
- linux内核启动2
- orcl在linux环境中创建表空间的方法
- centos6 编译ffmpeg
- Linux用diff比较两个文件的差异
- 新手学习Linux的常用命令
- linux C语言实现文件锁
- linux性能分析工具
- linux之sed用法
- 解密Linux kernel中的内核线程
- 谈谈如何学习Linux操作系统