2012-11-05 303 views
4

mingw包含gcc 4.6.3,與名稱 - i686-w64-mingw32。警告:無法找到條目符號nable-stdcall-fixup;違約

的Windows,一個Qt的.pro文件w.r.t一個Hello World程序:

QT   += core gui 
TEMPLATE = app 
TARGET  = ef 

SOURCES  = ef.cpp 
DEPENDPATH += . 

INCLUDEPATH += . 
INCLUDEPATH += c:/R-2.15.1/include 
INCLUDEPATH += c:/R-2.15.1/library/Rcpp/include 
INCLUDEPATH += c:/R-2.15.1/library/RInside/include 

LIBS  += -L c:/R-2.15.1/bin/i386 -lR 
LIBS  += -L c:/R-2.15.1/library/Rcpp/libs/i386 -lRcpp 
LIBS  += -L c:/R-2.15.1/library/RInside/libs/i386 -lRInside 

程序編譯如下:

enter image description here

通知有在最後一個警告。

系統路徑如下:

enter image description here

Qt的路徑:

enter image description here

請你指出我錯過了點。

UPDATE:


現在我已經更新了qmake.conf如下:

# 
# qmake configuration for win32-g++ 
# 
# Written for MinGW 
# 

MAKEFILE_GENERATOR = MINGW 
TEMPLATE  = app 
CONFIG   += qt warn_on release link_prl copy_dir_files debug_and_release debug_and_release_target precompile_header 
QT   += core gui 
DEFINES   += UNICODE QT_LARGEFILE_SUPPORT 
QMAKE_COMPILER_DEFINES += __GNUC__ WIN32 

QMAKE_EXT_OBJ   = .o 
QMAKE_EXT_RES   = _res.o 

QMAKE_CC  = gcc 
QMAKE_LEX  = flex 
QMAKE_LEXFLAGS  = 
QMAKE_YACC  = byacc 
QMAKE_YACCFLAGS  = -d 
QMAKE_CFLAGS  = 
QMAKE_CFLAGS_DEPS = -M 
QMAKE_CFLAGS_WARN_ON = -Wall 
QMAKE_CFLAGS_WARN_OFF = -w 
QMAKE_CFLAGS_RELEASE = -O2 
QMAKE_CFLAGS_DEBUG = -g 
QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses 

QMAKE_CXX  = g++ 
QMAKE_CXXFLAGS  = $$QMAKE_CFLAGS 
QMAKE_CXXFLAGS_DEPS = $$QMAKE_CFLAGS_DEPS 
QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON 
QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF 
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE 
QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG 
QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC 
QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD 
QMAKE_CXXFLAGS_RTTI_ON = -frtti 
QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti 
QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads 
QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions 

QMAKE_INCDIR  = 
QMAKE_INCDIR_QT  = $$[QT_INSTALL_HEADERS] 
QMAKE_LIBDIR_QT  = $$[QT_INSTALL_LIBS] 

QMAKE_RUN_CC  = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src 
QMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o [email protected] $< 
QMAKE_RUN_CXX  = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src 
QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o [email protected] $< 

QMAKE_LINK  = g++ 
QMAKE_LINK_C  = gcc 
QMAKE_LFLAGS  = -Wl, -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc 
QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads 
QMAKE_LFLAGS_EXCEPTIONS_OFF = 
QMAKE_LFLAGS_RELEASE = -Wl,-s 
QMAKE_LFLAGS_DEBUG = 
QMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,console 
QMAKE_LFLAGS_WINDOWS = -Wl,-subsystem,windows 
QMAKE_LFLAGS_DLL  = -shared 
QMAKE_LINK_OBJECT_MAX = 10 
QMAKE_LINK_OBJECT_SCRIPT= object_script 


QMAKE_LIBS  = 
QMAKE_LIBS_CORE   = -lkernel32 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32 
QMAKE_LIBS_GUI   = -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lws2_32 -lole32 -luuid -luser32 -ladvapi32 
QMAKE_LIBS_NETWORK  = -lws2_32 
QMAKE_LIBS_OPENGL  = -lopengl32 -lglu32 -lgdi32 -luser32 
QMAKE_LIBS_COMPAT  = -ladvapi32 -lshell32 -lcomdlg32 -luser32 -lgdi32 -lws2_32 
QMAKE_LIBS_QT_ENTRY  = -lmingw32 -lqtmain 

!isEmpty(QMAKE_SH) { 
    MINGW_IN_SHELL  = 1 
    QMAKE_DIR_SEP  =/
    QMAKE_COPY  = cp 
    QMAKE_COPY_DIR  = xcopy /s /q /y /i 
    QMAKE_MOVE  = mv 
    QMAKE_DEL_FILE  = rm 
    QMAKE_MKDIR  = mkdir 
    QMAKE_DEL_DIR  = rmdir 
    QMAKE_CHK_DIR_EXISTS = test -d 
} else { 
    QMAKE_COPY  = copy /y 
    QMAKE_COPY_DIR  = xcopy /s /q /y /i 
    QMAKE_MOVE  = move 
    QMAKE_DEL_FILE  = del 
    QMAKE_MKDIR  = mkdir 
    QMAKE_DEL_DIR  = rmdir 
    QMAKE_CHK_DIR_EXISTS = if not exist 
} 

QMAKE_MOC  = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc.exe 
QMAKE_UIC  = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic.exe 
QMAKE_IDC  = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc.exe 

QMAKE_IDL  = midl 
QMAKE_LIB  = ar -ru 
QMAKE_RC  = windres 
QMAKE_ZIP  = zip -r -9 

QMAKE_STRIP  = strip 
QMAKE_STRIPFLAGS_LIB += --strip-unneeded 
load(qt_config) 

的錯誤,現在已經改爲:

enter image description here

UPDATE

我只是刪除了空間Wl, and -enable-std之間..和上述錯誤消失:

enter image description here

+1

的'nable-STDCALL-fixup'來自被傳遞給'克參數'-enable-STDCALL-fixup' ++'。 g ++的mingw32版本將其解析爲'-e <...>',而在Linux上則例如按預期進行解析。我知道*有一個把這些參數傳遞給'mingw32-g ++'的技巧,但我不知道如何告訴qmake這樣做。也許這是一個開始。 – leemes

+2

這是一個修復,我發現:https://qt.gitorious.org/qt/qt/merge_requests/1154 - 關鍵是要在前面加上'輪候冊,'的說法'-enable-STDCALL-fixup'所以變成'-Wl,-enable-stdcall-fixup'。 qmake中的一個錯誤只是「忘記」這樣做。給定的錯誤修復(.conf文件)應該可以解決這個問題。你必須下載並把這個文件放到Qt安裝的qmake mkspecs文件夾中。 (我不知道確切的路徑) – leemes

+0

如果您發現了一個名爲「mkspecs」你只需把文件下的「mkspecs /不支持/ Win32的G ++ - 交叉/」文件夾中。 – leemes

回答

5

this merge request看到有在qmake.conf文件,配置何時使用,變量中的錯誤你使用qmake的默認配置。

-enable-stdcall-fixup需要用-Wl,作爲前綴,以選項的話,被mingw32-g++正確解析,因爲解析時-e...將被分割爲-e ...。此前綴僅表示「不要將以下內容解析爲-e nable-stdcall-fixup,而是將其解析爲-enable-stdcall-fixup」。

qmake.conf文件包含-Wl,但在錯誤的路線,因此合併請求,它說

領先「輪候冊,」顯然是不小心分裂到錯誤 線。

該修補程序將-Wl移動一行。您可以在qmake.conf文件中手動執行此操作,該文件應位於Qt安裝下的mkspecs/win32-g++/qmake.conf下。更改以下行:

QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc 
QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads -Wl 

進入這個:

QMAKE_LFLAGS = -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc 
QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads 

注意,應該有-Wl,-enable-stdcall-fixup之間沒有空格。它應該一個單一參數以達到我們想要的東西傳遞給g++

+0

你已經很好地概括了Michael,你和我在評論中談到了什麼! –

+0

我遇到了同樣的問題,但不得不編輯'mkspecs/default/qmake.conf' – sparrowt