需要用Mag文件编译C++和C代码的程序
我需要一个别人以前提供的Makefile能够用.CPP文件编译.C文件。创建此Makefile时,项目中没有任何.C文件,但情况发生了变化,因此我修改了Makefile,如下所示:需要用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 \
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可能会导致一些问题。把它们一个接一个地修好。