[aufgelöst] TagLib einbinden - unresolved external symbol



  • @Th69 Spiegelung meines Projektverzeichnisses, mitsamt include und lib-Ordner von TagLib:

    C:\Users\eigenartig\source\repos\exercise\Debug
    C:\Users\eigenartig\source\repos\exercise\exercise
    C:\Users\eigenartig\source\repos\exercise\x64
    C:\Users\eigenartig\source\repos\exercise\exercise.sln
    C:\Users\eigenartig\source\repos\exercise\Debug\exercise.pdb
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug
    C:\Users\eigenartig\source\repos\exercise\exercise\include
    C:\Users\eigenartig\source\repos\exercise\exercise\lib
    C:\Users\eigenartig\source\repos\exercise\exercise\x64
    C:\Users\eigenartig\source\repos\exercise\exercise\exercise.vcxproj
    C:\Users\eigenartig\source\repos\exercise\exercise\exercise.vcxproj.filters
    C:\Users\eigenartig\source\repos\exercise\exercise\exercise.vcxproj.user
    C:\Users\eigenartig\source\repos\exercise\exercise\main.cpp
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\exercise.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\exercise.log
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\main.obj
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\vc142.idb
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\vc142.pdb
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\exercise.tlog\CL.command.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\exercise.tlog\CL.read.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\exercise.tlog\CL.write.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\exercise.tlog\exercise.lastbuildstate
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\exercise.tlog\link-cvtres.read.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\exercise.tlog\link-cvtres.write.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\exercise.tlog\link-rc.read.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\exercise.tlog\link-rc.write.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\exercise.tlog\link.command.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\exercise.tlog\link.read.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\exercise.tlog\link.write.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\Debug\exercise.tlog\unsuccessfulbuild
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\aifffile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\aiffproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\apefile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\apefooter.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\apeitem.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\apeproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\apetag.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\asfattribute.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\asffile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\asfpicture.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\asfproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\asftag.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\attachedpictureframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\audioproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\chapterframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\commentsframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\eventtimingcodesframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\fileref.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\flacfile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\flacmetadatablock.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\flacpicture.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\flacproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\generalencapsulatedobjectframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\id3v1genres.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\id3v1tag.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\id3v2extendedheader.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\id3v2footer.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\id3v2frame.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\id3v2framefactory.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\id3v2header.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\id3v2synchdata.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\id3v2tag.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\infotag.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\itfile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\itproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\modfile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\modfilebase.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\modproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\modtag.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\mp4atom.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\mp4coverart.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\mp4file.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\mp4item.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\mp4properties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\mp4tag.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\mpcfile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\mpcproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\mpegfile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\mpegheader.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\mpegproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\oggfile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\oggflacfile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\oggpage.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\oggpageheader.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\opusfile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\opusproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\ownershipframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\podcastframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\popularimeterframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\privateframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\relativevolumeframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\rifffile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\s3mfile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\s3mproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\speexfile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\speexproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\synchronizedlyricsframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tableofcontentsframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tag.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\taglib.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\taglib_config.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\taglib_export.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tag_c.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tbytevector.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tbytevectorlist.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tbytevectorstream.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tdebuglistener.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\textidentificationframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tfile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tfilestream.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tiostream.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tlist.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tlist.tcc
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tmap.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tmap.tcc
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tpropertymap.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\trefcounter.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\trueaudiofile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\trueaudioproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tstring.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tstringlist.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\uniquefileidentifierframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\unknownframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\unsynchronizedlyricsframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\urllinkframe.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\vorbisfile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\vorbisproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\wavfile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\wavpackfile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\wavpackproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\wavproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\xingheader.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\xiphcomment.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\xmfile.h
    C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\xmproperties.h
    C:\Users\eigenartig\source\repos\exercise\exercise\lib\pkgconfig
    C:\Users\eigenartig\source\repos\exercise\exercise\lib\tag.lib
    C:\Users\eigenartig\source\repos\exercise\exercise\lib\tag_c.lib
    C:\Users\eigenartig\source\repos\exercise\exercise\lib\pkgconfig\taglib.pc
    C:\Users\eigenartig\source\repos\exercise\exercise\lib\pkgconfig\taglib_c.pc
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\exercise.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\exercise.log
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\main.obj
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\vc142.idb
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\vc142.pdb
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\exercise.tlog\CL.command.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\exercise.tlog\CL.read.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\exercise.tlog\CL.write.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\exercise.tlog\exercise.lastbuildstate
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\exercise.tlog\link-cvtres.read.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\exercise.tlog\link-cvtres.write.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\exercise.tlog\link-rc.read.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\exercise.tlog\link-rc.write.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\exercise.tlog\link.command.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\exercise.tlog\link.read.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\exercise.tlog\link.write.1.tlog
    C:\Users\eigenartig\source\repos\exercise\exercise\x64\Debug\exercise.tlog\unsuccessfulbuild
    C:\Users\eigenartig\source\repos\exercise\x64\Debug
    C:\Users\eigenartig\source\repos\exercise\x64\Debug\exercise.pdb
    

    Dann die MSVC-Optionen:

    Include Directories: C:\Users\eigenartig\source\repos\exercise\exercise\include
    Library Directories: C:\Users\eigenartig\source\repos\exercise\exercise\lib
    Additional Dependencies: tag.lib

    Folgendes Beispiel:

    #include <taglib/taglib.h>
    #include <taglib/fileref.h>
    #include <taglib/tstring.h>
    
    int main() {
    	TagLib::String string("hello");
    	TagLib::FileRef ref;
    }
    

    Rebuild Solution:

    1>------ Rebuild All started: Project: exercise, Configuration: Debug x64 ------
    1>main.cpp
    1>C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tiostream.h(53,30): warning C4251: 'TagLib::FileName::m_name': class 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' needs to have dll-interface to be used by clients of class 'TagLib::FileName'
    1>D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\include\xstring(4564): message : see declaration of 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>'
    1>C:\Users\eigenartig\source\repos\exercise\exercise\include\taglib\tiostream.h(54,31): warning C4251: 'TagLib::FileName::m_wname': class 'std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>' needs to have dll-interface to be used by clients of class 'TagLib::FileName'
    1>D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\include\xstring(4565): message : see declaration of 'std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>'
    1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl TagLib::String::String(char const *,enum TagLib::String::Type)" (__imp_??0String@TagLib@@QEAA@PEBDW4Type@01@@Z) referenced in function main
    1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __cdecl TagLib::String::~String(void)" (__imp_??1String@TagLib@@UEAA@XZ) referenced in function main
    1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl TagLib::FileRef::FileRef(void)" (__imp_??0FileRef@TagLib@@QEAA@XZ) referenced in function main
    1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __cdecl TagLib::FileRef::~FileRef(void)" (__imp_??1FileRef@TagLib@@UEAA@XZ) referenced in function main
    1>C:\Users\eigenartig\source\repos\exercise\x64\Debug\exercise.exe : fatal error LNK1120: 4 unresolved externals
    1>Done building project "exercise.vcxproj" -- FAILED.
    ========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
    


  • Dann schau mal mit "dumpbin.exe" in die "tag.lib", um zu sehen, ob sie sauber erstellt wurde (und auch die passenden Symbole exportiert sind).

    PS: Hast du denn eine statische oder dynamische (d.h. mit DLL) Library erstellt?
    Bei Einbindung der statischen TagLib mußt du auch das Makro TAGLIB_STATIC in deinem Projekt selbst verwenden.



  • Wie geil, mit #define TAGLIB_STATIC kompilierts.

    Wo hast du diese Information gefunden?



  • @Th69 Wow danke man.





  • So so.

    Könnte einen Hauch besser dokumentiert sein.



  • Du hättest es allen aber auch einfacher machen können, wenn du gleich geschrieben hättest, daß du eine statische TagLib gebaut und eingebunden hast. 😉



  • @Th69 D.h. man muss bei jeder statischen Lib (ohne DLL) immer mit Makros frickeln?

    EDIT: Und wie soll mein .gitignore File aussehen, wenn ich die TagLib Include- und Link-Directory im Projektverzeichnis liegen habe? Einfach ein Ignore auf den ganzen taglib Ordner? Muss ich da auf Lizenzen achten wenn ich das Projekt hochlade?



  • Nicht bei jeder Library, aber die Einbindung ist ja häufig compilerabhängig, wie z.B. __declspec(dllexport) und __declspec(dllimport) bzw. weder noch bei einer statischen Lib, und dafür eignen sich eben Makros (und wenn in den Library-Headern diese Unterscheidung auch nötig ist, so muß das Makro dann auch in dem Hauptprojekt angegeben werden).

    Und wie ich schon schrieb, würde ich die Libraries in einen eigenen Ordner deines Projekte-Hauptordners (also oberhalb deines konkreten Projekts) ablegen (damit es von mehreren Projekten verwendet werden kann).
    Und dieses solltest du dann in einem eigenen GIT-Repository sichern.



  • Ok vielen Dank nochmals.



  • Static, ich fass es nicht 😉 ... etwas ungünstig, dass die Lib in der Default-Konfiguration statisch gebaut wird (was man nicht so oft sieht - meist ists Gefummel wenn man ne Lib statisch braucht):

    taglib/CMakeLists.txt:11: option(BUILD_SHARED_LIBS "Build shared libraries" OFF)

    ... und dafür aber die zusätzliche Makro-Definition benötigt wird. Da wäre vielleicht ein TAGLIB_SHARED-Makro eine bessere Wahl gewesen. Schön, wenn eine Default-Konfiguration so viele Steine wie möglich aus dem Weg räumt.


Anmelden zum Antworten