c + + - Qt bibliotek link fejl i Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Projektet bygger fint på Linux, men har problemer med at forbinde i Windows.


1. udgave:



LNK2019: unresolved external symbol ...
LNK1120: 21 unresolved externals


.pro filen indeholder:


isEmpty(IDE\_BUILD\_TREE): IDE\_BUILD\_TREE = ../../qt-creator-debug
LIBS += -L$${IDE\_BUILD\_TREE}/lib/qtcreator/plugins -lMyLibrary



   Bemærk. MyLibrary implementeret til $${IDE\_BUILD\_TREE}/lib/qtcreator/plugins før opbygning. Bygning med Qt 5.10.1 og MSVC 2015.



Hvad er problemet/tricket her? Hvordan løser man?





2. udgave:



I biblioteket .pro fil VERSION er variabel defineret og resulterende bibliotek har navn MyLibrary1.lib. Derefter får jeg fejl:


:-1: error: LNK1181: cannot open input file 'MyLibrary.lib'


Hvad er bedre måde at løse problemet her: fjern VERSION eller fix .pro fil? Hvordan?





3. nummer:



En anden linkfejl:


mydialog.obj:-1: error: LNK2001: unresolved external symbol 
"struct QMetaObject const MyLibrary::staticMetaObject" 
(?staticMetaObject@MyLibrary@@3UQMetaObject@@B)


Der opstod en fejl på grund af følgende linje i kode (forsvinder, når den kommenteres):


mydialog.cpp:



    QMetaEnum myEnum = QMetaEnum::fromType<MyLibrary::MyEnumClass>();


mylibrary.h:



namespace MyLibrary {

Q\_NAMESPACE

enum class MYLIBRARYSHARED\_EXPORT MyEnumClass {
...
};

Q\_ENUM\_NS(MyEnumClass)
...
} // namespace MyLibrary


Og hvordan man løser den tredje?

Bedste reference


Første problemløsning:



Min dårlige: Fejl forårsaget af savnet MYLIBRARYSHARED\_EXPORT i nogle klasser 'erklæringer, som defineret i globale overskrift som:


#if defined(MYLIBRARY\_LIBRARY)
#  define MYLIBRARYSHARED\_EXPORT Q\_DECL\_EXPORT
#else
#  define MYLIBRARYSHARED\_EXPORT Q\_DECL\_IMPORT
#endif


Uden MYLIBRARYSHARED\_EXPORT bygger fint i Linux og Mac, men fejler i Windows.





2. udgave fix:



Mulig løsning - tilføj til .pro fil linje:


win32:CONFIG += skip\_target\_version\_ext


eller


win32:TARGET\_EXT = .dll 


at indstille outputfilen uden det store versionsnummer på Windows. Men jeg ser for eksempel Qt Creator plugins link biblioteker med store versionsnummer uden et problem. Hvordan gør man det?





3. problemløsning:



Behøver at udfylde Q\_NAMESPACE -deklarationen med MYLIBRARYSHARED\_EXPORT også:


namespace MyLibrary {

MYLIBRARYSHARED\_EXPORT Q\_NAMESPACE

enum class MYLIBRARYSHARED\_EXPORT MyEnumClass {
...
};

Q\_ENUM\_NS(MyEnumClass)
...
} // namespace MyLibrary