2012-08-03 257 views
0

我需要使用「nmake」構建我的Qt項目。
我正在使用Qt4.8,Windows 7 64Bit,VS2008 Command Prompt編譯器,帶有「nmake」。Qt nmake使用DEFINES變量構建

要求是,
我有多個預編譯的靜態庫,我想在我的Qt項目中使用。

所有靜態庫(名爲Type1,Type2,Type3和Type4)都是預編譯的,並生成相應的Type1.lib,Type2.lib,Type3.lib和Type4.lib庫文件。

我都用,說Type1.lib和Type3.lib在我的項目,
我知道常規方法,在這裏,裏面我的Qt生成.pro文件,我可以把

LIBS+=C:\Proj\PRO1\Type1.lib \ 
     C:\Proj\PRO1\Type3.lib 

HEADERS += C:\Proj\PRO1\Type1.h \ 
      C:\Proj\PRO1\Type3.h 

我在main.cpp中添加了相應的.h文件,以便從Type1和Type3庫中訪問apis。編譯和工作非常好。
但在我的情況下,有多個項目,我不想每次都這樣做。

我不想在我的項目中逐個包含頭文件;相反, 有一個全球性的頭文件GlobalHeader.h,具有限定它裏面的所有其他LIB頭文件的路徑信息,它看起來像這樣,

#ifndef GLOBALHEADER_H 
#define GLOBALHEADER_H 

#define TYPE1  "C:\Proj\PRO1\Type1.h" 
#define TYPE2  "C:\Proj\PRO2\Type2.h" 
#define TYPE3  "C:\Proj\PRO3\Type3.h" 
#define TYPE4  "C:\Proj\PRO4\Type4.h" 

#endif 

我的main.cpp文件看起來有些這樣的事,

#include GLOBAL_HEAD //this is my requirement 
#include TYPE1   //I should be able to use like this 
#include TYPE3   //... " ... 
#include <QtCore> 
#include <QtGui> 
#include <QApplication> 
#include <QTextEdit> 
int main(int argv, char **args) 
{ 
    QApplication app(argv, args); 
    QTextEdit textEdit; 
    textEdit.show(); 
    //Lib functions called from TYPE1 
    //... some operations ... 
    //... some more operations ... 
    //Lib functions called from TYPE3 
    //... some operation ... 
    //... some more operations ... 
    return app.exec(); 
} 

我給qmake的命令來編譯main.cpp中,

qmake -project DEFINES+=GLOBAL_HEAD=C:\Proj\GlobalHeader.h LIBS+=C:\Proj\PRO1\Type1.lib LIBS+=C:\Proj\PRO1\Type3.lib 

,它生成的.pro文件,下面,

DEFINES += GLOBAL_HEAD=C:\Proj\GlobalHeader.h 
LIBS += C:\Proj\PRO1\Type1.lib 
LIBS += C:\Proj\PRO1\Type3.lib 
TEMPLATE = app 
TARGET = 
DEPENDPATH += . 
INCLUDEPATH += . 
HEADERS += 
SOURCES += main.cpp 

現在,我的步驟是用對應test.pro文件生成Makefile文件,
所以我給,

qmake test.pro 

的Makefile,Makefile.Debug和Makefile.Release成功生成。

現在,我已經打開Visual Studio 2008的命令提示符,然後導航到我的項目目錄,並給編譯命令,

nmake all 

它產生的錯誤...

. 
. 
main.cpp 
C:\Proj\test\main.cpp(1) : error C2006: '#include' : expected a filename, found 'identifier' 
C:\Proj\test\main.cpp(1) : fatal error C1083: Cannot open include file: '': No such file or directory 
. 
. 

可有人請告訴我代碼有什麼問題?或者我錯過了qmake命令中的任何信息?我如何讓這個項目編譯?
對不起,如果我沒有寫得正確。如果您需要更多詳細信息,請告訴我。
在此先感謝您的幫助...

回答

0

回答什麼是錯的。這是因爲

#include GLOBAL_HEAD 

轉換爲

#include C:\Proj\GlobalHeader.h 

時應該封閉或者進「或尖括號

我嘗試添加到.pro文件

DEFINES += GLOBAL_HEAD=<C:\\Proj\\GlobalHeader.h> 

但沒有幫助

我不知道如何使它正確編譯,所以這只是答案的一半

+0

嗨羅馬,感謝您的回覆。我曾嘗試添加DEFINES + = GLOBAL_HEAD = \「C:\ Proj \ GlobalHeader.h \」。因此它將#include GLOBAL_HEAD反映爲#include「C:\ Proj \ GlobalHeader.h」。但是這並沒有幫助我。我忘了提及,TYPE1和TYPE3文件也在內部使用「#include GLOBAL_HEADER」。所以,qt試圖編譯它們並給出錯誤 - main.cpp C:\ Proj \ test \ main.cpp(2):error C2006:'#include':預期文件名,找到'identifier',即#包括TYPE1。 – kiranp 2012-08-03 10:21:20

+0

看來,Qt在編譯時,並沒有將TYPE1和TYPE3作爲預編譯的庫。 – kiranp 2012-08-03 10:31:43

+0

您可以在QtCreator的編譯輸出窗口中查看哪些參數被送入編譯器和鏈接器。 – 2012-08-03 14:44:55