4

This mingw contains gcc 4.6.3, with name - i686-w64-mingw32.

On Windows, a Qt's.pro file w.r.t a hello world program:

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 

The program compiles as follows:

enter image description here

Notice there is a warning at the end.

System PATH is as follows:

enter image description here

Qt's Path:

enter image description here

Please point out the point that I am missing.

UPDATE:


Now I have updated the qmake.conf as follows:

#
# 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 $@ $<
QMAKE_RUN_CXX       = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
QMAKE_RUN_CXX_IMP   = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

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)

The errors have now changed to:

enter image description here

UPDATE

I just removed the space between Wl, and -enable-std.. and the above error is gone:

enter image description here

Aquarius_Girl
  • 21,790
  • 65
  • 230
  • 411
  • 1
    The `nable-stdcall-fixup` comes from the argument `-enable-stdcall-fixup` which was passed to `g++`. The mingw32-version of g++ parses this as `-e<...>` while on linux for example it is parsed as expected. I know that *there is* a trick to pass such arguments to `mingw32-g++`, but I don't know how to tell qmake to do so. Maybe this is a start. – leemes Nov 05 '12 at 10:12
  • 2
    This is a fix I found: https://qt.gitorious.org/qt/qt/merge_requests/1154 -- The trick is to prepend `-Wl,` to the argument `-enable-stdcall-fixup` so it becomes `-Wl,-enable-stdcall-fixup`. A bug in qmake simply "forgets" to do this. The given bug fix (the .conf file) should fix this issue. You have to download and put this file into your qmake mkspecs folder of your Qt installation. (I don't know the exact path) – leemes Nov 05 '12 at 10:15
  • If you found a folder named "mkspecs" you simply put the file under "mkspecs/unsupported/win32-g++-cross/". – leemes Nov 05 '12 at 10:18
  • @leemes thanks for your helpful attitude. Firstly I can't see any "file" in that link. Please point me out. Secondly, the `mkspecs` folder contains the sub folder named "unsupported" but it doesn't contain the folder `win32-g++-cross`. There are other folders inside "unsupported", but not this one. I had installed this mingw from here: http://code.google.com/p/mingw-builds/ – Aquarius_Girl Nov 05 '12 at 10:28
  • Ok then try the following. Run `qmake -d` which will output a lot of things. There should be a line containing `-enable-stdcall-fixup`... To make life easier, you can write the output of `qmake -d` using the following command: `qmake -d > output.txt` and then open `output.txt` with any text editor and search for the line. Tell me if you found that line. – leemes Nov 05 '12 at 11:04
  • @leemes Thanks much. I'll post tomorrow. Am currently at home. – Aquarius_Girl Nov 05 '12 at 12:25
  • 1
    Ok. The verbose output of the command above might go to the standard error, so you might have to use `qmake -d 2> output.txt` instead `qmake -d > output.txt`. – leemes Nov 05 '12 at 12:45
  • 2
    Note that the bug isn't in `qmake` - the `mkspecs/win32-g++/qmake.conf` file is incorrect for the `QMAKE_LFLAGS` and `QMAKE_LFLAGS_EXCEPTIONS_ON` macro definitions. The `-Wl,` is in the `QMAKE_LFLAGS_EXCEPTIONS_ON` by mistake - it needs to be removed from that macro and added to the `QMAKE_LFLAGS` macro just in front of the `-enable-stdcall-fixup`. See http://stackoverflow.com/a/12383833/12711 for more details. – Michael Burr Nov 05 '12 at 21:54
  • And if you want to redirect both `stdout` and `stderr` to a file in a unified way (which will probably be most helpful if the build produces output on both handles): `qmake -d > output.txt 2>&1` – Michael Burr Nov 05 '12 at 22:03
  • @leemes The folder `win32-g++` is in `mkspecs`, not in the `unsupported` folder. I have found the qmake.conf and edited it. See the new errors now. – Aquarius_Girl Nov 06 '12 at 04:33
  • @MichaelBurr Thanks for coming in. I have modified the qmake.conf, se the edit and the new error, please. – Aquarius_Girl Nov 06 '12 at 04:34
  • @leemes I have removed the space between -Wl ad command and now that error is gone it seems. – Aquarius_Girl Nov 06 '12 at 04:43
  • @MichaelBurr OR leemes : Please put that as an answer, so that it can be selected. Thanks to both of you. – Aquarius_Girl Nov 06 '12 at 04:46

1 Answers1

5

As seen in this merge request there is a bug in the qmake.conf file which configures the variables used whenever you use the default configuration of qmake.

The option -enable-stdcall-fixup needs to be prefixed with a -Wl, in order to get parsed correctly by mingw32-g++ because -e... will be split into -e ... when parsed. This prefix simply means "do not parse the following as -e nable-stdcall-fixup but as -enable-stdcall-fixup".

The qmake.conf file contains -Wl but in a wrong line, hence the merge request, which says

the leading "-Wl," was apparently accidentally split off to the wrong line.

The patch moves the -Wl one line up. You can do this manually on your qmake.conf file, which should be located under the Qt installation under mkspecs/win32-g++/qmake.conf. Change the following lines:

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

Into this:

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

Note that there should be no space between -Wl, and -enable-stdcall-fixup. It should be passed as one single argument to g++ in order to achieve what we want.

leemes
  • 44,967
  • 21
  • 135
  • 183