windows - Udefineret reference linker fejl, mens du bruger id3lib bibliotek i en C ++ applikation

Indlæg af Hanne Mølgaard Plasc

Problem



Mit OS er Windows 7 Ultimate x64. Jeg bruger Qt 4.8 til at skrive et program, der vil bruge id3lib. Jeg har downloadet Windows-binærerne. Her er en del af * .pro filen, der viser, hvordan id3lib bibliotek bruges: [16]


HEADERS  += MainWindow.h 
    id3lib/id3/sized\_types.h 
    id3lib/id3/globals.h 
    id3lib/id3/tag.h 
    id3lib/id3/utils.h 
    id3lib/id3/id3lib\_frame.h 
    id3lib/id3/field.h 
    id3lib/id3/id3lib\_strings.h 
    id3lib/id3/id3lib\_streams.h

win32: LIBS += -L$$PWD/id3lib/ -lid3lib

INCLUDEPATH += $$PWD/id3lib
DEPENDPATH += $$PWD/id3lib


Som du kan gætte, er bibliotekets filer (id3lib.dll og id3lib.lib) i id3lib -mappen, og alle nødvendige overskrifter er i id3lib/id3 -mappen.


I globals.h definerede jeg follwing:


#define ID3LIB\_LINKOPTION LINKOPTION\_CREATE\_DYNAMIC


Og ændret følgende afsnit i samme fil:


#    if (ID3LIB\_LINKOPTION == LINKOPTION\_CREATE\_DYNAMIC)
       //used for creating a dynamic dll
#      define ID3\_C\_EXPORT extern \_declspec(dllexport)
#      define ID3\_CPP\_EXPORT \_\_declspec(dllexport)
#      define CCONV \_\_stdcall // Added for VB & Delphi Compatibility - By FrogPrince Advised By Lothar
#    endif


som følger:


#    if (ID3LIB\_LINKOPTION == LINKOPTION\_CREATE\_DYNAMIC)
       //used for creating a dynamic dll
#      define ID3\_C\_EXPORT Q\_DECL\_IMPORT
#      define ID3\_CPP\_EXPORT Q\_DECL\_IMPORT
#      define CCONV \_\_stdcall // Added for VB & Delphi Compatibility - By FrogPrince Advised By Lothar
#    endif


så det virker med Qt.


Dernæst har jeg inkluderet id3/tag.h og skrevet følgende kode:


ID3\_Tag tag("test.wma");
qDebug() << tag.size();


Efter kompilering fik jeg følgende fejl:


undefined reference to `\_imp\_\_\_ZN7ID3\_TagC1EPKc'
undefined reference to `\_imp\_\_\_ZNK7ID3\_Tag4SizeEv'
undefined reference to `\_imp\_\_\_ZN7ID3\_TagD1Ev'
undefined reference to `\_imp\_\_\_ZN7ID3\_TagD1Ev'
(several few, same format: `\_imp\_\_\_xxxxx\_Tagxxxx')


Jeg ved hvad der forårsager undefined reference, men i mit tilfælde, hvorfor linkeren ikke kunne finde implementeringen? Er det nu der i id3lib.dll? Er der nogen der ved, om der er nogen løsning?

Bedste reference


Problemet ligger ikke i værktøjskæder, men ABI.


Den findes som standard almindelig C ABI, så du kan forbinde både lib og a med MinGw, hvis de kun indeholder almindeligt C symboler.


Men det er ikke sandt i jeres tilfælde (da sådan definition som ID3\_CPP\_EXPORT eksisterer).


Du bør forsøge at lave bibliotek af youserlf.
Til at begynde med skal du installere msys, åbne msys shell, gå til projektmappe og prøv


./configure && make

Andre referencer 1


Da du ikke bruger Visual Studio, der understøtter .lib-filer for at linke dit projekt til den rigtige DLL, skal du bruge id3lib.a (eller noget lignende). GNU-værktøjskæden er forskellig fra MS One, så du har brug for de rigtige statiske linkfiler. Mit råd er at kompilere biblioteket alene på din compiler, da det er open source, er det værd at gøre det.