You have warnings of some "BUILT_DLL" being redefined. Fix that first. Then I 
use

  QT += whatever

instead of your 

  QT *= whatever

I don't know what the *= operator is supposed to do, even though I think it 
exists.

Anyway, QtCore being linked by default this is most probably not the problem.


Don't forget to link your moc'ed files as well (typically done by qmake for you 
automagically). A 

  make distclean
  qmake
  make

might help, just to make sure you compile and link the latest moc'ed files.

By the way you should use a "unique" macro name for that "DLL export" stuff for 
each DLL (which you only need to add to the headers *.h anyway): "EXPORT" is 
pretty generic and might conflict with other macro definitions in other 
(indirectly) included headers (see again your warning)!

So for Foo.dll I usually have a FOO_EXPORT macro etc.


These are just the Usual Suspects, I did not have a close look at your 
code/output ;)


On another note, Qt provides some "cross-platform" macros which expands to that 
__declspec stuff on Windows and to "nothing" on most other platforms. Can't 
remember its name right now, but I thing it's defined in the global namespace 
in qt.h or qt_global.h or something...

Good luck,
  Oliver

Am 16.01.2012 um 15:44 schrieb erick oliveira da silva <[email protected]>:

> Hallo Thales, I included the qmake and library directories in PATH but 
> unfortunatelly nothing changed. Thanks anyway.
> 
> Thiago, sorry, but I am not sure if I understood correctly your sugestion: 
> so, I tried to build my dll (that export functions that have several Qt 
> functions and objects) in a different directory using qmake macro DESTDIR. 
> Unfortunatelly I got the same errors. Thanks for you answer.
> 
> Here is a simple example that also doesn't work:
> 
> ---- qtdll.pro  -------------------------------
> 
> QT -= gui
> QT *= core
> 
> TEMPLATE = lib
> CONFIG *= qt dll release
> 
> DEFINES += BUILD_DLL
> 
> CONFIG(debug, debug|release) {
>     DESTDIR = ./binaries_debug
>     } else {
>     DESTDIR = ./binaries_release
>     }
> 
> SOURCES = dllfct.cpp 
> 
> HEADERS = dllfct.h
> 
> --- dllfct.h --------------------------------------
> 
> #ifdef BUILD_DLL
> // the dll exports
> #define EXPORT __declspec(dllexport)
> #else
> // the exe imports
> #define EXPORT __declspec(dllimport)
> #endif
> 
> // function to be imported/exported
> EXPORT void tstfunc (void);
> 
> -----------------------------------------------------
> 
> ---- dllfct.cpp ----------------------------------
> 
> #include <stdio.h>
> #include <QString>
> #include "dllfct.h"
> 
> EXPORT void tstfunc (void)
> {
>     QString a("Hello");
>     QString b("World");
>     a.append(" ");
>     a.append(b);
>     a.append("\n");
>    printf (a.toAscii());
> }
> 
> ----------------------------
> 
> Here is the compiler output:
> 
> D:\dllmingw\qt>qmake qtdll.pro
> 
> D:\dllmingw\qt>mingw32-make -f Makefile.Release
> 
> g++ -c -O2 -Os -momit-leaf-frame-pointer -frtti -fno-exceptions -Wall 
> -DUNICODE
> -DQT_LARGEFILE_SUPPORT -DQT_STATIC_BUILD -DBUILD_DLL -DQT_DLL -DQT_NO_DEBUG 
> -DQT
> _CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT 
> -DQT_HAVE
> _SSE2 -DQT_THREAD_SUPPORT -I"..\..\qt_static_4.7.4\include\QtCore" 
> -I"..\..\qt_s
> tatic_4.7.4\include" -I"..\..\qt_static_4.7.4\include\ActiveQt" -I"release" 
> -I".
> .\..\qt_static_4.7.4\mkspecs\default" -o release\dllfct.o dllfct.cpp
> In file included from dllfct.cpp:3:
> dllfct.h:1:1: warning: "BUILD_DLL" redefined
> <command-line>: warning: this is the location of the previous definition
> g++ -static -static-libgcc -Wl,-s -shared 
> -Wl,--out-implib,.\binaries_release\li
> bqtdll.a -o binaries_release\qtdll.dll release/dllfct.o  
> -L"d:\qt_static_4.7.4\l
> ib" -lQtCore -lole32 -luuid -lws2_32 -ladvapi32 -lshell32 -luser32 -lkernel32
> Creating library file: .\binaries_release\libqtdll.a
> release/dllfct.o:dllfct.cpp:(.text+0x18): undefined reference to 
> `_imp___ZN7QStr
> ing16fromAscii_helperEPKci'
> release/dllfct.o:dllfct.cpp:(.text+0x54): undefined reference to 
> `_imp___ZN7QStr
> ing6appendERKS_'
> release/dllfct.o:dllfct.cpp:(.text+0x74): undefined reference to 
> `_imp___ZNK7QSt
> ring7toAsciiEv'
> release/dllfct.o:dllfct.cpp:(.text+0x96): undefined reference to 
> `_imp___Z5qFree
> Pv'
> release/dllfct.o:dllfct.cpp:(.text+0xaf): undefined reference to 
> `_imp___ZN7QStr
> ing4freeEPNS_4DataE'
> release/dllfct.o:dllfct.cpp:(.text+0xc8): undefined reference to 
> `_imp___ZN7QStr
> ing4freeEPNS_4DataE'
> release/dllfct.o:dllfct.cpp:(.text$_ZN7QString6appendEPKc[QString::append(char
>  c
> onst*)]+0x1e): undefined reference to `_imp___ZN7QString9fromAsciiEPKci'
> release/dllfct.o:dllfct.cpp:(.text$_ZN7QString6appendEPKc[QString::append(char
>  c
> onst*)]+0x2f): undefined reference to `_imp___ZN7QString6appendERKS_'
> release/dllfct.o:dllfct.cpp:(.text$_ZN7QString6appendEPKc[QString::append(char
>  c
> onst*)]+0x4b): undefined reference to `_imp___ZN7QString4freeEPNS_4DataE'
> collect2: ld returned 1 exit status
> mingw32-make: *** [binaries_release\qtdll.dll] Error 1
> 
> Best Regards,
> Erick
> 
> 
> 2012/1/16 Thiago Macieira <[email protected]>
> On Monday, 16 de January de 2012 15.52.44, erick oliveira da silva wrote:
> > Hi,
> >
> > I am new with qt programming using mingw.
> >
> > I have compiled Qt 4.7.4 statically with gcc(mingw) version  4.4.0 at
> > windows vista 32 bits, following the instructions in this page:
> > http://developer.qt.nokia.com/wiki/How_to_build_a_static_Qt_version_for_Wind
> > ows_with_gcc
> >
> > I can build static libraries and qt applications without any problem, but
> > when I try to build a shared library(dll) that uses qt, I get several
> > "undefined reference" linking errors in qt functions form QString, QDialog,
> > etc...
> 
> Please make sure that you have a completely separate build directory for the
> DLL build. You can share the sources with the static build, provided you did
> not build the static one in the sources.
> 
> The cleanest way is to make them completely separate.
> 
> > The pro files I created till now build shared libraries in gcc linux
> > without any problem, but not in gcc windows(mingw). Do I need to define a
> > special qmake variable in the pro file to build suscessfully a qt dll in
> > gcc at windows?
> 
> No, the same .pro file should be enough, provided you use the right qmake.
> 
> --
> Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
>   Software Architect - Intel Open Source Technology Center
>      PGP/GPG: 0x6EF45358; fingerprint:
>      E067 918B B660 DBD1 105C  966C 33F5 F005 6EF4 5358
> 
> _______________________________________________
> Interest mailing list
> [email protected]
> http://lists.qt-project.org/mailman/listinfo/interest
> 
> 
> _______________________________________________
> Interest mailing list
> [email protected]
> http://lists.qt-project.org/mailman/listinfo/interest
_______________________________________________
Interest mailing list
[email protected]
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to