2013-01-03 34 views
1

我從相同的C源文件 - 可執行文件和共享庫構建兩個目標。共享庫需要代碼可重定位(使用-fPIC編譯),但由於各種原因,我無法在可執行文件中使用可重定位代碼。有沒有一種標準/常用的方法來處理Makefile中的這種情況?Makefile:來自相同源的兩個目標使用不同標誌編譯兩次

+0

有幾種方法。我會說最乾淨的是有兩個目錄文件的目錄,一個用於標準對象,另一個用於可重定位。這可以接受嗎? – Beta

+0

我同意Beta,將所有中間文件等構建到兩個單獨的目錄中。這樣,所有的Makefile目標都有獨立的名字(儘管你當然可以使用Make通配符來避免代碼重複)。 –

+0

謝謝,夥計們!你們是否願意把它寫成答案,以便我能接受它? – sudarkoff

回答

1

我建議你有兩個目錄中的目標文件,一個標準的對象和一個用於可重定位對象。事情是這樣的:

$(STANDARD_OBJS) = $(addprefix $(STANDARD_OBJS_DIR)/, $(OBJS)) 
$(RELOC_OBJS) = $(addprefix $(RELOC_OBJS_DIR)/, $(OBJS)) 

$(RELOC_OBJS_DIR)/%.o: CCFLAGS += -fPic 
$(RELOC_OBJS_DIR)/%.o $(STANDARD_OBJS_DIR)/%.o: $(SRC)/%.cc 
    g++ $< -o [email protected] 

(還有更復雜的變化,但是這將讓你開始)

0

注入一些規則,以便您的二進制版本的目標依賴並使用static_lib。

shared_lib:whatever.so ...

static_lib:whatever.a ...

二進制:static_lib

相關問題