假设我们有下面这样的一个程序,源代码如下:
/* 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文件。
相关文章
- OSG-获取OSG的源代码和第三方库并编译
- 使用autotools工具用configure、make、make install编译安装linux工程的详细步骤
- 使用国人的koala来重新预编译BOOTSTRAP的LESS文件
- IDEA编译的时使用lombok中的log显示“找不到符号“
- GCC编译和链接多个文件(包括源文件、目标文件、汇编文件等)
- Boost库的源码编译以及使用
- C++开始前篇,深入编译链接
- VS2010中的编译错误:error C2061: 语法错误: 标识符"string"
- 使用maven-compiler-plugin插件,在pom文件设置默认的jdk编译版本(以JDK1.8为例)
- java 编译jar包_用命令行编译java并生成可执行的jar包方法