关闭

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

标签: makefileinterfacecompilerpathtools化工
3590人阅读 评论(3) 收藏 举报
分类:
 

编译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 /

              v4l.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 /

              v4l.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 /

              v4l.h /

              spca5xx.h /

              avilib.h

 

moc_camgui.o: moc_camgui.cpp /

              camgui.h /

              v4l.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 ##### 

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:224562次
    • 积分:2966
    • 等级:
    • 排名:第12327名
    • 原创:69篇
    • 转载:20篇
    • 译文:1篇
    • 评论:94条
    最新评论