文件列表:php
main.cc++
#include <stdio.h> int main() { printf("hello world\n"); return 0; }
命令:ubuntu
$ gcc -o main main.cspa
Makefile:blog
main: main.o main.o: main.c gcc -c main.c clean: rm main main.o
Makefile:get
cc = gcc main: main.o main.o: main.c $(cc) -c main.c clean: rm main main.o
Makefile:it
cc = gcc main: main.o main.o: main.c $(cc) -c main.c # Makefile所在目錄出現clean文件時, 忽略它; 沒有PHONY, 出現clean文件時make clean出錯 .PHONY: clean clean: rm main main.o
文件列表:自動化
main.cio
#include <stdio.h> void func(); int main() { func(); return 0; }
comm.cclass
#include <stdio.h> void func() { printf("hello world\n"); }
命令:
方式一
$ gcc -c main.c
$ gcc -c comm.c
$ gcc -o main main.o comm.o
方式二:
$ gcc -o main main.c comm.c
Makefile:
cc = gcc main: main.o comm.o main.o: main.c $(cc) -c main.c -o main.o comm.o: comm.c $(cc) -c comm.c -o comm.o .PHONY: clean clean: rm main main.o comm.o
文件列表:
main.c
#include <stdio.h> #include "comm.h" int main() { func(); return 0; }
comm.c
#include "comm.h" #include <stdio.h> void func() { printf("hello world\n"); }
comm.h
void func();
命令:
$ gcc main.c comm.c -o main
Makefile:
cc = gcc main: main.o comm.o main.o: main.c $(cc) -c main.c -o main.o comm.o: comm.c $(cc) -c comm.c -o comm.o .PHONY: clean clean: rm main main.o comm.o
文件列表:
同一個目錄下
main.c
#include <stdio.h> #include "comm.h" int main() { func(); return 0; }
comm.c
#include "comm.h" #include <stdio.h> void func() { printf("hello world\n"); }
comm.h
void func();
comm2.c
#include "comm2.h" #include <stdio.h> void func2() { printf("comm2 hello world\n"); }
comm2.h
void func2();
命令:
$ gcc main.c comm.c comm2.c -o main
Makefile:
cc = gcc main: main.o comm.o comm2.o main.o: main.c $(cc) -c main.c -o main.o comm.o: comm.c $(cc) -c comm.c -o comm.o comm2.o: comm2.c $(cc) -c comm2.c -o comm2.o .PHONY: clean clean: rm main main.o comm.o comm2.o
文件列表:
. ├── Makefile ├── comm.c ├── include │ └── comm.h └── main.c
main.c
#include <stdio.h> #include "comm.h" int main() { func(); return 0; }
comm.c
#include "comm.h" #include <stdio.h> void func() { printf("hello world\n"); }
include/comm.h
void func();
命令:
$ gcc main.c comm.c -Iinclude -o main
Makefile:
cc = gcc main: main.o comm.o main.o: main.c $(cc) -c main.c -Iinclude -o main.o comm.o: comm.c $(cc) -c comm.c -Iinclude -o comm.o .PHONY: clean clean: rm main main.o comm.o
文件列表:
. ├── Makefile ├── comm.c ├── comm.h └── main.c 0 directories, 4 files
main.c
#include <stdio.h> #include "comm.h" int main() { func(); return 0; }
comm.c
#include "comm.h" #include <stdio.h> void func() { printf("hello world\n"); }
comm.h
void func();
命令:
$ gcc -c comm.c
$ ar rcs libcomm.a comm.o
$ gcc -o main main.c -L. libcomm.a
Makefile:
cc = gcc all: mylib main mylib: comm.o ar rcs libcomm.a comm.o comm.o: comm.c $(cc) -c comm.c -o comm.o main: main.c $(cc) main.c -L. libcomm.a -o main .PHONY: clean clean: rm main main.o comm.o
文件列表:
. ├── Makefile ├── comm.cpp ├── comm.h └── main.cpp 0 directories, 4 files
main.cpp
#include <stdio.h> #include "comm.h" int main() { mynamespace::func(); return 0; }
comm.cpp
#include "comm.h" #include <stdio.h> namespace mynamespace { void func() { printf("hello world\n"); } }
comm.h
namespace mynamespace { void func(); }
命令:
$ g++ main.cpp comm.cpp -o main
Makefile:
cc = g++ main: main.o comm.o main.o: main.cpp $(cc) -c main.cpp -o main.o comm.o: comm.cpp $(cc) -c comm.cpp -o comm.o .PHONY: clean clean: rm main main.o comm.o
只要make看到一個[.o]文件,它就會自動的把[.c]文件加在依賴關係中,下面的Makefile是等同的:
Makefile
cc = g++ main: main.o comm.o main.o: main.cpp $(cc) -c main.cpp -o main.o comm.o: comm.cpp $(cc) -c comm.cpp -o comm.o .PHONY: clean clean: rm main main.o comm.o
Makefile
cc = g++ main: main.o comm.o main.o: $(cc) -c main.cpp -o main.o comm.o: $(cc) -c comm.cpp -o comm.o .PHONY: clean clean: rm main main.o comm.o
「.o」的目標的依賴目標會自動推導爲「.c」,而且其生成命令是「$(CC) –c $(CPPFLAGS) $(CFLAGS)」,下面兩個Makefile是等同的:
cc = g++ main: main.o comm.o main.o: $(cc) -c main.cpp -o main.o comm.o: $(cc) -c comm.cpp -o comm.o .PHONY: clean clean: rm main main.o comm.o
cc = g++ main: main.o comm.o .PHONY: clean clean: rm main main.o comm.o
若是你定義了一個規則是".c.o"那麼其就是雙後綴規則,意義就是".c"是源文件的後綴,".o"是目標文件的後綴。以下示例:
.c.o: $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
$@--目標文件,$^--全部的依賴文件,$<--第一個依賴文件。 下面兩個Makefile是等同的。
Makefile
main:main.o comm.o gcc -o main main.o comm.o main.o:main.c comm.h gcc -c main.c comm.o:comm.c comm.h gcc -c comm.c
Makefile
main:main.o comm.o gcc -o $@ $^ main.o:main.c comm.h gcc -c $< comm.o:comm.c comm.h gcc -c $<
咱們想看一下執行make後都運行了哪些命令,可使用-n參數。
有Makefile以下:
cc = g++ main: main.o comm.o main.o: $(cc) -c main.cpp -o main.o comm.o: $(cc) -c comm.cpp -o comm.o .PHONY: clean clean: rm main main.o comm.o
$ make -n
顯示以下信息:
g++ -c main.cpp -o main.o
g++ -c comm.cpp -o comm.o
cc main.o comm.o -o main
文章不錯,支持一下
參考:http://wiki.ubuntu.org.cn/index.php?title=Gcchowto&variant=zh-hans