[Interest] Link Errors when Creating a Windows DLL containing Qt Widgets

Till Oliver Knoll till.oliver.knoll at gmail.com
Mon May 14 17:49:03 CEST 2012


2012/5/14 Michael Jackson <imikejackson at gmail.com>:
>> ...
>> Could it be that it needs to be:
>>
>> PipelineBuilderLib_EXPORT class WFilterWidget : public ...
>>
>> instead?
>> ...
> Putting "PipelineBuilderLib_EXPORT" before the "class" keyword just results in a bunch of compiler warnings

Ah sorry, my wrong:

  http://msdn.microsoft.com/en-us/library/a90k134d%28v=vs.80%29.aspx

I usually define a simple *.h. For instance if my DLL was called Foo I
would have FooLib.h with simply:

#ifndef FOOLIB_H
#define FOOLIB_H

#include <QtCore/QtGlobal>
#ifdef FOO_EXPORT
# define FOO_API Q_DECL_EXPORT
#else
# define FOO_API Q_DECL_IMPORT
#endif

#endif

Note the usage of Q_DECL_EXPORT|IMPORT (defined in <QtCore/QtGlobal>)
which automagically gets rendered as this MSVC-specific
__declspec-stuff, and to appropriate "export" declarations (or mostly
"nothing") everywhere else (so not sure whether it gets rendered as
__attribute__ ((visibility("default"))) on Linux, but we'll leave that
away for now for simplicity).


In the actual implementation header Foo.h:

#include "FooLib.h"

class FOO_API Foo : public QObject {
  Q_OBJECT
public:
  ...
};

I prefer:

class Foo : public QObject {
  Q_OBJECT
public:
  FOO_API Foo(); // c'tor
  FOO_API virtual ~Foo();

  FOO_API void exportedMethod();
  void notVisibleOutsideOfDLL();

signal:
  void someSignalWhichCanAlsoBeConnectedFromOutsideOfThisDLL();

protected:
  FOO_API void canBeOverwrittenWithClassesInOtherLibraries();
  void canOnlyBeOverwrittenInThisLibrary();
  ...
};


Off course you then define FOO_EXPORT when you build the DLL, but
DON'T define it when building everything else. This works
cross-platform, including to connecting the above signal to some slot
in another library/executable ("signals across DLL boundaries").

Cheers, Oliver



More information about the Interest mailing list