预编译,编译,链接的原理
2006-01-18 00:53
330 查看
假设我们有下面这样的一个程序,源代码如下:
/* main.c */
#include "mytool1.h"
#include "mytool2.h"
int main(int argc,char **argv)
{
mytool1_print("hello");
mytool2_print("hello");
}
/* mytool1.h */
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif
/* mytool1.c */
#include "mytool1.h"
void mytool1_print(char *print_str)
{
printf("This is mytool1 print %s/n",print_str);
}
/* mytool2.h */
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
/* mytool2.c */
#include "mytool2.h"
void mytool2_print(char *print_str)
{
printf("This is mytool2 print %s/n",print_str);
}
当然由于这个程序是很短的我们可以这样来编译
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
# 这是上面那个程序的Makefile文件
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
我的问题是:由makefile文件可以看出,main.o文件是和main.c, mytool1.h, mytool2.h相依赖的。为什么在 gcc -c main.c编译main.o时候,没有涉及两个.h文件呢?
答案是:main.c文件中的#include预处理器命令,告诉预处理器打开指定的头文件,并在#include语句所在的地方插入头文件。所以,在实际编译这个步骤上, gcc -c main.c,由于经历了预编译,main.c中已经包含了两个.h文件。
/* main.c */
#include "mytool1.h"
#include "mytool2.h"
int main(int argc,char **argv)
{
mytool1_print("hello");
mytool2_print("hello");
}
/* mytool1.h */
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif
/* mytool1.c */
#include "mytool1.h"
void mytool1_print(char *print_str)
{
printf("This is mytool1 print %s/n",print_str);
}
/* mytool2.h */
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
/* mytool2.c */
#include "mytool2.h"
void mytool2_print(char *print_str)
{
printf("This is mytool2 print %s/n",print_str);
}
当然由于这个程序是很短的我们可以这样来编译
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
# 这是上面那个程序的Makefile文件
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
我的问题是:由makefile文件可以看出,main.o文件是和main.c, mytool1.h, mytool2.h相依赖的。为什么在 gcc -c main.c编译main.o时候,没有涉及两个.h文件呢?
答案是:main.c文件中的#include预处理器命令,告诉预处理器打开指定的头文件,并在#include语句所在的地方插入头文件。所以,在实际编译这个步骤上, gcc -c main.c,由于经历了预编译,main.c中已经包含了两个.h文件。
相关文章推荐
- (转)编译原理简述 (预处理>编译>汇编>链接)
- 编译原理 (预处理>编译>汇编>链接)
- python的一些基础操作和c文件的链接编译原理
- 编译原理 机械工业出版社 课后答案 GitHub链接
- 编译原理 机械工业出版社 课后答案 GitHub链接
- gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解
- gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接
- gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解
- C++编译链接原理简介
- 总结extern “C”时引发的血案——c++的“编译、链接”原理与过程
- 深入理解预编译,编译,汇编,链接的过程——之预编译
- 编译原理 机械工业出版社 课后答案 GitHub链接
- 编译原理 机械工业出版社 课后答案 GitHub链接
- VC++程序编译链接的原理与过程
- 【编译原理】程序的编译链接执行过程
- C中的预编译编译链接
- 编译链接原理
- VC++程序编译链接的原理与过程(QQ dhms)
- 编译原理 机械工业出版社 课后答案 GitHub链接
- 编译原理 机械工业出版社 课后答案 GitHub链接