2015-08-26 101 views
-2

我需要一個以前提供的Makefile,能夠使用.CPP文件編譯.C文件。在這個Makefile被創建時,我們沒有在項目中的任何.C文件,但已經改變了,所以我修改Makefile文件如下:需要使用Makefile編譯一個包含C++和C代碼的程序

GPP=g++ 

CPPSRCS= \ 
    ./CBDefault.cpp \ 
    ./testPFDefault.cpp \ 
    ./PFDefault.cpp \ 
    ./xapiDebug.cpp \ 
    ./init.cpp \ 
    ./tracePriorityManager.c \ 

CFLAGS= -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -IASB -IALU 
-Istub -IIKAN 
OBJ_DIR=../build/pxy/obj 

OBJS := $(foreach s,$(CPPSRCS:.cpp=.o),$(OBJ_DIR)/$(notdir $s)) 


PROG=../build/pxy/pxy 

$(PROG): $(OBJS) | $(dir $(PROG)) 
    $(GPP) -o [email protected] $(OBJS) 

$(OBJ_DIR): 
    mkdir -p [email protected] 

$(foreach src,$(CPPSRCS),$(eval $(OBJ_DIR)/$(notdir $(src:.cpp=.o)): 
CSRC=$(src))) 


$(OBJS): | $(OBJ_DIR) 
    $(GPP) $(CFLAGS) -c -o [email protected] $(CSRC) 

添加tracePriorityManager.c到CPPSRCS宏列表。 編譯導致錯誤信息,內容如下一個長長的清單:

../build/pxy/obj/tracePriorityManager.c:10:3607: warning: null  
character(s) ignored 
../build/pxy/obj/tracePriorityManager.c:10:3618: warning: null  
character(s) ignored 
../build/pxy/obj/tracePriorityManager.c:10: error: stray ?\1? in program 
../build/pxy/obj/tracePriorityManager.c:10:3620: warning: null 
character(s) ignored 

你可以建議將解決這個問題的Makefile文件的變化?

+0

使用默認規則,'.c'文件通常使用'gcc'進行編譯。無論如何,這些警告(肯定可以解決),而不是錯誤。 –

+0

名稱「** CPP ** SRCS」響鈴嗎? – Olaf

+0

@πάνταῥεῖ:實際上,**有**錯誤... – Olaf

回答

0

您應該爲C源創建一個不同的變量並使用gcc和CFLAGS編譯它。 看看你的規則 - 它將* .cpp轉換爲* .o,但不會談論* .c。

+0

好的嘗試,但沒有針對真正的問題,OP更喜歡被泄露到目前爲止。 –

+0

用g ++編譯c可能會導致一些問題。一一解決。 – EvgeniyZh

-2

假設您共享相同的ld和編譯標誌爲您的C++和c編譯。

CSRC = CSOURCE FILES 

或只是

CSRC := $(wildcard *.c) 


OBJS += $(foreach s,$(CSRCS:.c=.o),$(OBJ_DIR)/$(notdir $s)) 

據我所知G ++可以編譯GCC文件沒有問題。

編輯:需要使用通配符函數來實際獲取文件列表。 我對g ++和c的錯誤。只有鏈接不成問題。您將不得不使用OBJC的另一個設置文件,並在另一個規則中明確使用gcc來編譯它們。只要確保在OBJ中彙總所有對象文件並且鏈接到g ++。 我真的建議使用隱式規則來編譯c和C++,然後添加一個鏈接規則。

關於字符警告。我扔了一個很長的猜測,但可能有什麼與文件預期的字符集?林不知道,但編號嘗試​​複製粘貼內容到我的電腦上的一個新的文件,並重新編譯它。

0

我解決了這個問題的另一種方式:

我改變了.c文件的名稱.CPP和包含在外部的「C」源文件內容{..file內容..}

還將Makefile中的文件名稱從.c更改爲.cpp並解決了問題。

相關問題