编译QT/E应用程序时发生的多重定义问题和解决方法

 

编译QT/E应用程序时发生的多重定义问题和解决方法

 Linux系统下Make一个QT/E的应用程序时,发生了多重定义的问题,情况如下。

[root@localhost cam]# make
Makefile:
135 : warning: overriding commands  for  target `moc_camgui.cpp '
Makefile: 132 : warning: ignoring old commands  for  target `moc_camgui.cpp '
g ++   - o camgui camgui.o main.o camgui.o moc_camgui.o moc_camgui.o  - L / root / qte / qt - 2.3 . 10 / lib  - lm  - lqte
camgui.o(.bss
+ 0x47a0 ): multiple definition of `dquant '
camgui.o(.bss + 0x47a0 ): first defined here
camgui.o(.text
+ 0x5e1c ): In function `MainForm::MainForm[not - in - charge](QWidget * char   const * , unsigned) ' :
: multiple definition of `MainForm::MainForm[not - in - charge](QWidget * char   const * , unsigned) '
camgui.o(.text + 0x5e1c ): first defined here
camgui.o(.text
+ 0x67e4 ): In function `MainForm::MainForm[ in - charge](QWidget * char   const * , unsigned) ' :
: multiple definition of `MainForm::MainForm[ in - charge](QWidget * char   const * , unsigned) '
camgui.o(.text + 0x67e4 ): first defined here
camgui.o(.text
+ 0x71ac ): In function `MainForm:: ~ MainForm [not - in - charge]() ' :
: multiple definition of `MainForm:: ~ MainForm [not - in - charge]() '
camgui.o(.text + 0x71ac ): first defined here
camgui.o(.text
+ 0x71dc ): In function `MainForm:: ~ MainForm [ in - charge]() ' :
: multiple definition of `MainForm:: ~ MainForm [ in - charge]() '
camgui.o(.text + 0x71dc ): first defined here
camgui.o(.text
+ 0x720c ): In function `MainForm:: ~ MainForm [ in - charge deleting]() ' :
: multiple definition of `MainForm:: ~ MainForm [ in - charge deleting]() '
camgui.o(.text + 0x720c ): first defined here
camgui.o(.text
+ 0x7240 ): In function `MainForm:: event (QEvent * ) ' :
: multiple definition of `MainForm:: event (QEvent * ) '
camgui.o(.text + 0x7240 ): first defined here

 

    首先,检查了源码,所有的头文件都进行了“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 ##### 

经过这样的修改后,就编译通过了。

你可能感兴趣的:(Path,化工,interface,compiler,tools,makefile)