Makefile學(xué)習(xí)筆記

代碼示例

// main.cpp
#include <iostream>
#include "functions.h"
using namespace std;

int main()
{
    printhello();
    cout << "This is main:" << endl;
    cout << "The factorial of 5 is: " << factorial(5) << endl;
    return 0;
}

// functions.h
#ifndef CONNECTIONPOOL_FUNCTIONS_H
#define CONNECTIONPOOL_FUNCTIONS_H
void printhello();
int factorial(int n);
#endif //CONNECTIONPOOL_FUNCTIONS_H

// printhello.cpp
#include <iostream>
#include "functions.h"
using namespace std;
void printhello()
{
    int i;
    cout << "Hello world" << endl;
}

// factorial.cpp
#include "functions.h"
int factorial(int n)
{
    if(n == 1)
        return 1;
    else
        return n * factorial(n-1);
}

法一(不用makefile):

g++ main.cpp factorial.cpp printhello.cpp -o main
./main

法二(創(chuàng)建Makefile文件):

version 1:

# VERSION 1
# hello 為生成的可執(zhí)行文件,依賴于后面的三個.cpp文件
# g++前面加一個TAB的空格
hello: main.cpp printhello.cpp factorial.cpp
    g++ -o hello main.cpp printhello.cpp factorial.cpp
image.png

version 2:

## VERSION 2
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o
## make時執(zhí)行g(shù)++ 先找 TARGET ,TARGET不存在找OBJ,OBJ不存在,
##編譯三個.cpp文件生成.o文件
## 然后再編譯OBJ文件,生成可執(zhí)行文件hello
$(TARGET): $(OBJ)
    $(CXX) -o $(TARGET) $(OBJ)
## main.o這樣來的,編譯main.cpp生成
main.o: main.cpp
    $(CXX) -c main.cpp
printhello.o: printhello.cpp
    $(CXX) -c printhello.cpp
factorial.o: factorial.cpp
    $(CXX) -c factorial.cpp
image.png

version3:

## VERSION 3
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o

## 編譯選項(xiàng),顯示所有的warning
CXXLAGS = -c -Wall

## $@表示的就是冒號前面的TARGET,$^表示的是冒號后OBJ的全部.o依賴文件
$(TARGET): $(OBJ)
    $(CXX) -o $@ $^

## $<表示指向%.cpp依賴的第一個,但是這里依賴只有一個
## $@表示指向%.o
%.o: %.cpp
    $(CXX) $(CXXLAGS) $< -o $@

## 為了防止文件夾中存在一個文件叫clean
.PHONY: clean

## -f表示強(qiáng)制刪除,此處表示刪除所有的.o文件和TARGET文件
clean:
    rm -f *.o $(TARGET)
image.png

version4: 目錄加入新文件自動識別

# VERSION 4 ,目錄加入新文件自動識別
CXX = g++
TARGET = hello
# 所有當(dāng)前目錄的.cpp文件都放在SRC里面
SRC = $(wildcard *.cpp)
# 把SRC里面的.cpp文件替換為.o文件
OBJ = $(patsubst %.cpp, %.o,$(SRC))

CXXLAGS = -c -Wall
## $@表示的就是冒號前面的TARGET,$^表示的是冒號后OBJ的全部.o依賴文件
$(TARGET): $(OBJ)
    $(CXX) -o $@ $^

## $<表示指向%.cpp依賴的第一個,但是這里依賴只有一個
## $@表示指向%.o
%.o: %.cpp
    $(CXX) $(CXXLAGS) $< -o $@

.PHONY: clean
clean:
    rm -f *.o $(TARGET)
image.png

cmake的使用

  • 第一 創(chuàng)建好CMakeLists.txt,并同目錄創(chuàng)建build目錄
  • 在build目錄執(zhí)行 cmake .. 命令,
  • 最后執(zhí)行 make 命令, 得到可執(zhí)行文件


    image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容