其他
通俗易懂:Linux下的C语言开发之Makefile编写
来源:EEPW
如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。 如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
[cpp] view plaincopy
/* 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 ",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 ",print_str);
}
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
# 这是上面那个程序的Makefile文件
[plain] view plaincopy
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
clean:
rm -rf *.o main
target:components
TAB rule
main:main.o mytool1.o mytool2.o
“$@”代表目标文件。 “$^”代表所有的依赖文件。 “$<”代表第一个依赖文件。
# 简化后的Makefile
[html] view plaincopy
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o:main.c mytool1.h mytool2.h
gcc -c $<
mytool1.o:mytool1.c mytool1.h
gcc -c $<
mytool2.o:mytool2.c mytool2.h
clean:
rm -rf *.o main
“gcc -c $<”经过简化后,我们的Makefile是简单了一点,不过人们有时候还想简单一点。
.c.o:
gcc -c $<
# 这是再一次简化后的Makefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
.c.o:
gcc -c $<
clean:
rm -rf *.o main
make在当前目录下找 "Makefile"或"makefile"的文件。 如果找到,则会找文件中第一个目标文件(target),如上个例子中的main。 如果main命令的执行依赖后面命令执行所产生的文件,则先执行后面命令。 当main命令需要的文件生成完毕,则执行main命令。
-END-
推荐阅读
【01】深度:震惊世间的惊人代码(附完整代码)【02】编译器如何将高级语言转化成汇编语言的?【03】C语言在嵌入式系统编程时的注意事项【04】由C语言编写的C编译器是怎样来的?【05】还没搞懂C语言指针?最详细的干货讲解【06】C语言结构体(struct)最全的讲解【07】为什么在C语言中,goto这么不受待见?