gcc/g++和Makefile

最簡單的Makefile

文件列表: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

c++含頭文件

文件列表:

.
├── 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

相關文章
相關標籤/搜索