2016-10-28 23 views
0

我有一個包含在N文件夾組織源文件和頭文件的項目(我們姑且稱之爲folder1folder2,...,folderNÇMakefile文件,編譯項目的部分具有不同的規則

我想要編譯folder1-Wall但其他人與-w。 問題是其他文件夾(2到N)只包含文件夾1中某些源文件中包含的頭文件。

當我編譯folder1,-Wall也將適用於該文件夾中的標題,我不希望這樣。

這是我迄今爲止所使用makefile文件:

CC=gcc 
LIBS=-iquotefolder2 ... -iquotefoldern 

SOURCES=$(wildcard folder1/*.c) $(wildcard folder2/*.c) ... $(wildcard foldern/*.c) 
OBJECTS=$(SOURCES:.c=.o) 

folder1/%.o: folder1/%.c 
    $(CC) -Wall $(LIBS) -c -o [email protected] $^ 

folder2/%.o: folder2/%.c 
    @$(CC) -w $(LIBS) -c -o [email protected] $^ 
... 

folderN/%.o: folderN/%.c 
    @$(CC) -w $(LIBS) -c -o [email protected] $^ 

lib.dll: $(OBJECTS) 
    @$(CC) -w -shared -Wl,-soname,[email protected] -o [email protected] $^ 

all: lib.dll 

有什麼辦法來實現這一目標? 我也嘗試將folder2編譯到lib.a中的folderN,並在編譯folder1時鏈接該庫,但gcc將(顯然)嘗試包含頭文件

+0

https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html(任何人,如果確實是OPs問題的解決方案,請隨時將信息寫入實際答案中)。 – hyde

+0

所以你想'folder1/source.c'用'-Wall'編譯,但用'-w'包含'folder2/header.h'文件? –

+0

是的,這是正確的 –

回答

1

你不能用Makefile來做到這一點。 Makefile只處理源文件,所以你只能在源文件粒度上的Makefile中提供標誌。換句話說,在源文件上調用gcc,並且在gcc調用中未提及標頭。

但是,您可以指示gcc在不同的文件,以調整警告:

  1. 通行證-isystem <dir>標誌GCC - 這會讓位於目錄作爲系統頭gcc治療頭。默認情況下,gcc不會在系統標題中發出任何警告。

  2. 使用#pragma GCC diagnostic從源文件忽略警告:

來源:

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wall" 
#include "folder2/bad-header.h" 
#pragma GCC diagnostic pop 
+0

不幸的是,我不允許修改代碼 –

+0

'-isystem

'完全適合我需要的,謝謝 –

相關問題