以前在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命令就好了,不知爲什麼!