2016-07-25 30 views
1

我想讓我的靜態庫具有Makefile,我可以有條件地將它構建爲程序來執行簡單的自檢。我現在Makefille看起來像如下:具有自檢功能的靜態庫的Makefile

OBJECTS = sm3.o ./core/sm3_internal.o 
INCLUDES = -I. -I./core 
CFLAGS = -g -Wall -O3 
CC = c99 

OUT = libsm3.a 

%.o: %.c 
    $(CC) -c -o [email protected] $< $(CFLAGS) $(INCLUDES) 

$(OUT): $(OBJECTS) 
    ar rcs $(OUT) $(OBJECTS) 

在我主要的庫文件,我有:

#ifdef TEST 
main(int argc, int* argv[]) 
{ 
    //my self-test logic here 
} 
#endif 

我應該在哪裏添加-DTEST標誌?如果我把它添加到CFLAGS,然後添加一行:

test: $(OBJECTS) 

庫也將建立與主,這顯然不是我想要的。

+2

爲什麼不把測試程序在一個單獨的源文件? – immibis

+0

@immibis沒有特別的理由,這樣驗證庫似乎是個好主意 – adamws

回答

1

我建議你編譯main.c有條件代替:

$(TESTOUT): $(OBJECTS) $(TESTOBJ) 
    $(CC) -o [email protected] $< 
+0

第一個建議會產生庫,稍微修改一下(用OBJECTS替換OUT並用sm3替換 - 命名需要匹配嗎?),我已經得到了我的測試工作可執行文件,但有以下問題:1)如果我先建立測試,然後使用庫時,我得到重複的主要功能,如果我建立庫首先我的測試版本失敗,錯誤'未定義的引用WinMain' '使用cygwin) – adamws

+0

咋,舊的目標文件沒有改變,所以你定義的並不重要。你可以通過刪除目標文件來避開它,但是我想你應該用兩個單獨的目標正確地完成它。我會刪除第一個建議。 – a3f