在Linux系统下Make一个QT/E的应用程序时,发生了多重定义的问题,情况如下。
首先,检查了源码,所有的头文件都进行了“ifndef/define/endif”保护,没有任何不对的地方;然后,又检查了环境变量,也正常。后来,想到我的这个项目框架代码是用QT/E的自动化工具生成的,即uic生成源码文件,progen生成pro文件,tmake生成Makefile,想到会不会是Makefile出了问题,于是检查了Makefile,确实,原因就在这个自动化生成的Makefile上。
#############################################################################
# Makefile for building camgui
# Generated by tmake at 17:08, 2007/09/24
# Project: camgui
# Template: app
#############################################################################
####### Compiler, tools and options
CC = gcc
CXX = g++
CFLAGS = -pipe -Wall -W -O2 -DNO_DEBUG
CXXFLAGS= -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -fno-default-inline -DNO_DEBUG
INCPATH = -I$(QTDIR)/include
LINK = g++
LFLAGS =
LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lm -lqte
MOC = $(QTDIR)/bin/moc
UIC = $(QTDIR)/bin/uic
TAR = tar -cf
GZIP = gzip -9f
####### Files
HEADERS = avilib.h /
camgui.h /
jpeg_header.h /
spca5xx.h /
decoder.h /
gamma.h /
v 4l .h
SOURCES = camgui.cpp /
main.cpp
OBJECTS = camgui.o / //注意这里,引用了两次camgui.o
main.o /
camgui.o
INTERFACES = camgui.ui
UICDECLS = camgui.h
UICIMPLS = camgui.cpp
SRCMOC = moc_camgui.cpp / //注意这里,引用了两次moc_camgui.cpp
moc_camgui.cpp
OBJMOC = moc_camgui.o / //还有这里,引用了两次moc_camgui.o
moc_camgui.o
DIST =
TARGET = camgui
INTERFACE_DECL_PATH = .
####### Implicit rules
.SUFFIXES: .cpp .cxx .cc .C .c
.cpp.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.cxx.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.cc.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.C.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.c.o:
$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
####### Build rules
all: $(TARGET)
$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC)
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
moc: $(SRCMOC)
tmake: Makefile
Makefile: camgui.pro
tmake camgui.pro -o Makefile
dist:
$(TAR) camgui.tar camgui.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST)
$(GZIP) camgui.tar
clean:
-rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET)
//这个Makefile还有另一个问题,就在clean子命令上,它会把你的窗体源码文件一并清除,这是相当危险的。这样的话,你在窗体源码文件中增加的代码会随之清除。比如那些你自定义的槽和信号,以及其它私有函数和对象等等……
-rm -f *~ core
####### Sub-libraries
###### Combined headers
####### Compile
//如下很多代码也是莫名重复了两遍,应该把重复的清除。
camgui.o: camgui.cpp /
camgui.h /
camgui.ui
main.o: main.cpp /
camgui.h /
v 4l .h /
spca5xx.h /
avilib.h
camgui.h: camgui.ui
$(UIC) camgui.ui -o $(INTERFACE_DECL_PATH)/camgui.h
camgui.cpp: camgui.ui
$(UIC) camgui.ui -i camgui.h -o camgui.cpp
camgui.o: camgui.cpp /
camgui.h /
camgui.ui
moc_camgui.o: moc_camgui.cpp /
camgui.h /
v 4l .h /
spca5xx.h /
avilib.h
moc_camgui.o: moc_camgui.cpp /
camgui.h /
v 4l .h /
spca5xx.h /
avilib.h
moc_camgui.cpp: camgui.h
$(MOC) camgui.h -o moc_camgui.cpp
moc_camgui.cpp: camgui.h
$(MOC) camgui.h -o moc_camgui.cpp
###### End Of Makefile #####
经过这样的修改后,就编译通过了。