linux下C工程層級目錄的Makefile編寫

以前在ubuntu的gcc寫小型的測試程序,都是直接調用gcc命令及其選項,突然有想完成稍大的工程的衝動,於是用了下makefile,果然強大。

目錄包含 bin src inc lib obj , makefile文件與它們同級,是事先設置好的,以下爲源碼文件:


exchange.h

#ifndef _EXCHANGE_H_
#define _EXCHANGE_H_

int exchange(int *xp, int y);

#endif

exchange.c

#include "../inc/exchange.h"

int exchange(int *xp, int y)
{
  int x = *xp;
  *xp = y;
  return x;
}

main.c

#include <stdio.h>

int main()
{
  int a = 3;
  int b = exchange(&a, 4);
  printf("a = %d, b = %d\n", a, b);
  return 0;
}


Makefile

# 編譯變量賦值
CC = gcc
AR = ar rc        # 打包生成靜態庫
RM = rm -f

#vpath %.h ./inc
#vpath %.c ./src

# 設置路徑變量
CUR_DIR = $(shell pwd)
BIN_DIR = $(CUR_DIR)/bin/
SRC_DIR = $(CUR_DIR)/src/
LIB_DIR = $(CUR_DIR)/lib/
INC_DIR = $(CUR_DIR)/inc/
OBJ_DIR = $(CUR_DIR)/obj/

$(BIN_DIR)main.exe : $(OBJ_DIR)main.o $(LIB_DIR)exchange.a
    $(CC) $(OBJ_DIR)main.o $(LIB_DIR)exchange.a -o $(BIN_DIR)main.exe

$(OBJ_DIR)main.o : $(SRC_DIR)main.c
    $(CC) -c $(SRC_DIR)main.c -o $(OBJ_DIR)main.o

$(LIB_DIR)exchange.a : $(OBJ_DIR)exchange.o
    $(AR) $(LIB_DIR)exchange.a $(OBJ_DIR)exchange.o

$(OBJ_DIR)exchange.o : $(SRC_DIR)exchange.c
    $(CC) -c $(SRC_DIR)exchange.c -o $(OBJ_DIR)exchange.o

.PHONY : clean
clean:
    rm -f ./obj/*.o ./bin/* ./lib/*.a


Makefile文件指定了工程目錄中層級文件的依賴關係和目標文件的輸出路徑。我用path定義文件搜索路徑 與 Makefile中路徑變量 同時存在時曾出現“make 放棄循環依賴...“的警告,折騰半天時間,最後註銷掉vpath命令就好了,不知爲什麼!


工程目錄下載地址


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章