假设我们有下面这样的一个程序,源代码如下:
/* 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文件。
相关文章
- 如何检查Eclipse的gcc c++编译器版本?
- RT-Thread BSP qemu-virt64-aarch64 的编译环境搭建
- 作为移动开发你不能不了解的编译流程
- 基于matlab的QC-LDPC编译码误码率仿真,译码为最小和译码算法
- cmd命令行执行java程序的编译和执行的方法及可能出现找不到或无法加载主类的错误的解决
- centos6.5编译android-2.2_froyo的几个问题jdk,gcc,arm-gcc
- [编译原理]如何判断某文法的二义性以及找到文法对应的语言
- 基于MATLAB的LDPC编译码误码率仿真,仿真调制为64QAM,对比不同译码迭代次数
- 在centos中编译putty时提示找不到gtk库的解决办法
- 鸿蒙内核源码分析(编译脚本篇) | 如何防编译环境中的牛皮癣 | 百篇博客分析OpenHarmony源码 | v58.01