需要用Mag文件编译C++和C代码的程序

需要用Mag文件编译C++和C代码的程序,c++,c,compiler-errors,makefile,C++,C,Compiler Errors,Makefile,我需要一个别人以前提供的Makefile能够用.CPP文件编译.C文件。创建此Makefile时,项目中没有任何.C文件,但情况发生了变化,因此我修改了Makefile,如下所示: GPP=g++ CPPSRCS= \ ./CBDefault.cpp \ ./testPFDefault.cpp \ ./PFDefault.cpp \ ./xapiDebug.cpp \ ./init.cpp \ ./tracePriorityManager.c \

我需要一个别人以前提供的Makefile能够用.CPP文件编译.C文件。创建此Makefile时,项目中没有任何.C文件,但情况发生了变化,因此我修改了Makefile,如下所示:

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 $@ $(OBJS)

$(OBJ_DIR):
    mkdir -p $@

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


$(OBJS): | $(OBJ_DIR)
    $(GPP) $(CFLAGS) -c -o $@ $(CSRC)
将tracePriorityManager.c添加到CPPSRC宏列表中。 编译会产生一长串错误消息,其中包含以下内容:

../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来解决这个问题吗

您应该为C源代码创建一个不同的变量,并使用gcc和CFLAGS编译它。
看看你的规则-它将*.cpp转换为*.o,但不涉及*.c

> P>假设你共享C++和C编译的LD和编译标志。
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++,只需添加一个链接规则。
关于字符警告。我猜得很长,但可能与文件中预期的字符集有关吗?我不确定,但我尝试将内容复制粘贴到我计算机上的新文件中并重新编译。

我用另一种方法解决了问题:

我将.c文件的名称更改为.cpp,并将源文件内容包含在外部c{..file content..}


还将Makefile中的文件名从.c更改为.cpp,并解决了该问题

使用默认规则,通常使用gcc编译.c文件。无论如何,这些警告肯定是需要纠正的,而不是错误。CPPSRC这个名字有什么意义吗?@πάνταῥεῖ: 实际上,有一个错误…看起来不像是Makefile问题。看起来您的C源文件中有一些垃圾字符。可能已损坏或被编辑器插入。您是否确实打开了该文件以查看其外观是否符合预期?可能需要以十六进制模式打开才能看到一些字符,例如null。如果看不到tracePriorityManager.c的源代码,则很难确定,但症状与将UTF-16或UCS-2提供给需要8位输入的编译器一致。如果你做了一次很好的尝试,但没有针对真正的问题,那么它看起来是否合理呢?OP更愿意透露到目前为止。用g++编译c可能会导致一些问题。把它们一个接一个地修好。