PDA

View Full Version : build lib and dll with qmake



jh
3rd March 2007, 13:14
hi,

i want to build a dynamic library using qmake. using the template 'lib'
and CONFIG += dll it builds a dll.
nevertheless, to link that library to a programm i need the .lib ? how
can a build a .dll and a .lib at the same time?

best regards,
jh

wysota
3rd March 2007, 13:31
Hmm.. I think it should be created automatically (did you remember about __declspec(dllexport)?), but if it's not the case, read this:
http://support.microsoft.com/kb/131313

fullmetalcoder
3rd March 2007, 13:56
Hmm.. I think it should be created automatically (did you remember about __declspec(dllexport)?), but if it's not the case, read this:
http://support.microsoft.com/kb/131313

the __declspec() stuff is not portable... If you use Qt you should rely on the convinience macros : Q_DECL_EXPORT and Q_DECL_IMPORT instead. The first one has to be set when building a dll and the second one when linking to a dll. They can be managed either by an include file common to all the files of the dll, typically looking like this :


#ifdef _X_BUILD_
#if (defined(QT_DLL) || defined(QT_SHARED)) && !defined(QT_PLUGIN)
// lib being compiled shared
#define X_EXPORT Q_DECL_EXPORT
#else
// lib being embedded
#define X_EXPORT
#else
// lib being linked against (must be shared on Window$!)
#define X_EXPORT Q_DECL_IMPORT
#endif

or inside the projects through the DEFINES variable. In the dll project

DEFINES += -DX_EXPORT=Q_DECL_EXPORT
and in the client project :

DEFINES += -DX_EXPORT=Q_DECL_IMPORT

Then all classes/function/variables meant to be exported (accessible when linking against the lib) have to be prefixed with X_EXPORT (or whatever the name choosen ;) ). For instance :


X_EXPORT void someFunction();

class X_EXPORT someClass
{
public:
someClass();
}

Hope this helps. :)

jh
3rd March 2007, 13:58
the problem is that if i set
CONFIG += staticlib it builds a .lib and if i set
CONFIG += dll it builds a .dll. i want both at the same time.

best regards,
jh

fullmetalcoder
3rd March 2007, 15:52
the problem is that if i set
CONFIG += staticlib it builds a .lib and if i set
CONFIG += dll it builds a .dll. i want both at the same time.

best regards,
jh
You're unclear... Do you want both static and shared libraries or a shared one and it's import library (which can only be static...)? In the first case what you need is to add : "CONFIG += static_and_shared" (or it might as well be shared_and_static, I don't remember exactly). But then you might face troubles : the static lib could overwrite (or be overwritten) by the import library of the shared one...

jh
3rd March 2007, 17:37
actually i want a shared library (dll).

but if you want to use that library you have to link a *.lib to
your program at compile time and ship then the *.dll with your exe so
you can use the shared library at run time.

for instance, that is the code i used to put in my makefiles i created
without qmake:


libbasic: $(BASIC_OBJ)
link \
/NOLOGO $(QTLIB) opengl32.lib vfw32.lib gdi32.lib user32.lib \
/BASE:0x39D00000 \
/SUBSYSTEM:windows /DLL /incremental:no /VERSION:3.31 \
/out:libbasic.dll /implib:libbasic.lib \
/LIBPATH:"$(QTDIR)\lib" $(BASIC_OBJ)
lib /out:libbasic.lib /subsystem:console $(BASIC_OBJ)


this builds from obj files a libbasic.lib and a libbasic.dll.


regards,
jh

fullmetalcoder
3rd March 2007, 17:42
actually i want a shared library (dll).

but if you want to use that library you have to link a *.lib to
your program at compile time and ship then the *.dll with your exe so
you can use the shared library at run time.
qmake has no problem doing this... Do you use the commercial edition of Qt? If so your question doesn't make sense because everything is properly handled by the VS integration. Otherwise it does not make sense either because VS is not supported by the Open Source edition of Qt... In this case you have to fallback to MinGW which does not generate .lib along with .dll but .a instead...

Is that clear enough???

jh
3rd March 2007, 18:00
yes, i use the commercial version of qt on windows. but i do not use the
vs ide. i use xemacs and msys.

regards,
jh

fullmetalcoder
3rd March 2007, 18:04
yes, i use the commercial version of qt on windows. but i do not use the
vs ide. i use xemacs and msys.
Commercial Qt but not VS ??? Sounds quite weird but anyway : MSYS uses MinGW AFAIK so you definitely don't need any .lib file! Can build your lib and check for a .a file??? If it is not present you should take care of the macro stuff mentioned earlier in the thread and if it is all you troubles should seem so far away... ;)

jh
3rd March 2007, 18:28
i bought and installed visual studio C++, but i do not use the IDE
because i do not like the editor. i use xemacs for editing source code,
msys as a shell and just the plain c++ compiler (cl, link) to compile
and link the code. almost the same way i used to compile code when
i programmed on unix systems. i even wrote makefiles by myself but
now i also want my qt programs on my MacMini (opensource version of qt,
gnu c++). so i started playing around with qmake to generate makefiles. but when
i specify a shared lib i only get the dll without the import library (.lib)
on windows, which i need to link the library to the exe.

best regards,
jh

fullmetalcoder
3rd March 2007, 18:32
ithe import library (.lib)
That's where you're wrong... .lib are generated by MSVC *ONLY* the GNU toolchain (whatever the platform) generates a .a instead Is this .a file present after compilation or not???

jh
3rd March 2007, 18:45
i know that .a is only for gnu. the problem is not on the Mac.

the problem is on the windows side (MS VC++) because i do not
get the .lib, only the .dll ?!

here is my .pro file:

TEMPLATE = lib

# CONFIG += dll
# CONFIG += staticlib
CONFIG += static_and_shared

DEFINES += _VMP_WINDOWS_
# DEFINES += _DEBUG_basic_hashcode_

QMAKE_CLEAN += *~

TARGET = basic
DEPENDPATH += .
INCLUDEPATH += .

QT += network
VERSION = 1.0.0

target.path = ../_libs
INSTALLS += target

# Input
HEADERS += basic.h Exception.h MessageService.h
SOURCES += basic.cpp Exception.cpp MessageService.cpp


i run qmake, i run nmake and get a .dll (but no .lib)

jh

fullmetalcoder
4th March 2007, 08:35
i know that .a is only for gnu. the problem is not on the Mac.

the problem is on the windows side (MS VC++) because i do not
get the .lib, only the .dll ?!

here is my .pro file:

TEMPLATE = lib

# CONFIG += dll
# CONFIG += staticlib
CONFIG += static_and_shared

DEFINES += _VMP_WINDOWS_
# DEFINES += _DEBUG_basic_hashcode_

QMAKE_CLEAN += *~

TARGET = basic
DEPENDPATH += .
INCLUDEPATH += .

QT += network
VERSION = 1.0.0

target.path = ../_libs
INSTALLS += target

# Input
HEADERS += basic.h Exception.h MessageService.h
SOURCES += basic.cpp Exception.cpp MessageService.cpp
i run qmake, i run nmake and get a .dll (but no .lib)

Want a .dll (and its import lib) only? Use "CONFIG += dll".

What's the point of "target.path = ../_libs" ? AFAIK the install mechanism is rarely used on windows (binary installer are fvored) and besides doesn't make much sense here... Don't you think "DESTDIR = ../_libs" would be better ?

jh
4th March 2007, 09:01
thanx for the hint. i tried CONFIG += dll but it still does
not work. the dll is build but still the .lib is not build.
but anyway the compiler tries to copy the .lib which is not build. do i have to
build an static version first?


Generieren von Code...
link /LIBPATH:"c:\Qt\4.1.4-com\lib" /NOLOGO /INCREMENTAL:NO /INCREMENTAL:NO /DLL /OUT:"release\model.dll" @C:/DOKUME~1/jh/LOKALE~1/Temp\nm21.tmp
copy /y "release\model.lib" "c:\01. - Arbeit\C++\shared_libs\basic\libs\model.lib"
Das System kann die angegebene Datei nicht finden.
copy /y "release\model.dll" "c:\01. - Arbeit\C++\shared_libs\basic\libs\model.dll"
1 Datei(en) kopiert.

regards,
jh

fullmetalcoder
4th March 2007, 09:15
thanx for the hint. i tried CONFIG += dll but it still does
not work. the dll is build but still the .lib is not build.
but anyway the compiler tries to copy the .lib which is not build. do i have to
build an static version first?


Generieren von Code...
link /LIBPATH:"c:\Qt\4.1.4-com\lib" /NOLOGO /INCREMENTAL:NO /INCREMENTAL:NO /DLL /OUT:"release\model.dll" @C:/DOKUME~1/jh/LOKALE~1/Temp\nm21.tmp
copy /y "release\model.lib" "c:\01. - Arbeit\C++\shared_libs\basic\libs\model.lib"
Das System kann die angegebene Datei nicht finden.
copy /y "release\model.dll" "c:\01. - Arbeit\C++\shared_libs\basic\libs\model.dll"
1 Datei(en) kopiert.


I've never used MSVC but by comparing the two build commands (your own and the above one) it is obvious than the /implib switch is missing (BTW M$ switch syntax sucks a great deal... :P ). If you're sure that this hasn't been caused by a manipulation of yours you should report the bug to Trolltech and waiting for a fix you can always try this workaround :

QMAKE_LINK_SHLIB_CMD += /implib:$${TARGET}.lib

Hope this helps. :)

Chuk
17th August 2010, 21:10
I've been running into this same problem. I created a project using MinGW, and now want to build with MSVC. Below is what I added to the .pro file, and is working for me (non of the above did).

win32-msvc* {
LIBS += Advapi32.lib Setupapi.lib
CONFIG -= dll
CONFIG += shared static
}

The LIBS was required as the "difference" of mingw.