Problem mit Libnoise



  • Hallo,

    ich bin gerade dabei einen Oberflächengenerator auf Basis der Libnoise zu schreiben (libnoise.sourceforge.net)

    Nun bekomme ich immer ein Linkerproblem in Visual Studio 2008 Pro.
    Ich hab daraufhin nur mal die ersten beiden Tutorials auf obiger Seite durchgenommen und gemacht. Mein Programm ist also folgendes:

    #include <iostream>
    #include <noise/noise.h>
    
    using namespace noise;
    
    int main (int argc, char** argv)
    {
      module::Perlin myModule;
      double value = myModule.GetValue (1.25, 0.75, 0.50);
      std::cout << value << std::endl;
      return 0;
    }
    

    Und ich bekomme diese Fehler

    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: virtual double __thiscall noise::module::Perlin::GetValue(double,double,double)const " (?GetValue@Perlin@module@noise@@UBENNNN@Z)" in Funktion "_main".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall noise::module::Perlin::Perlin(void)" (??0Perlin@module@noise@@QAE@XZ)" in Funktion "_main".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: virtual __thiscall noise::module::Module::~Module(void)" (??1Module@module@noise@@UAE@XZ)" in Funktion ""public: virtual __thiscall noise::module::Perlin::~Perlin(void)" (??1Perlin@module@noise@@UAE@XZ)".

    Ich habe den kompletten include Ordner schon in das Verzeichnis von Visual Studio verschoben und auch die Lib ist zugefügt...

    Hab auch schon den GNU Compiler mit Code::Blocks probiert, aber der hat das gleiche Problem...

    Verstehe wirklich nicht, was ich falsch gemacht hab. Irgendwie will er ja die Klasse nicht annehmen!

    Ich wäre für jede Antwort sehr dankbar!

    Freundliche Grüße,
    Jan



  • Wahrscheinlich können mir 90% der Leute hier helfen, nur meine Frage ist zu doof...
    Sorry deswegen, aber ich hänge hier echt.

    VG



  • Edit: hier stand Quatsch.



  • und auch die Lib ist zugefügt

    Wahrscheinlich nicht, nicht richtig, oder die falsche. Der Linker meckert schleißlich, daß er nix finden kann was so heißt 🙂

    Haben die sowas wie... Dokumentation?



  • Hello again,

    also das Problem war, dass ich die .obj Daten nicht eingebunden hatte.
    Nun lief es einige Male ohne Probleme und nun habe ich plötzlich folgenden Fehler bekommen:

    MSVCRTD.lib(MSVCR90D.dll) : error LNK2005: __wassert ist bereits in LIBCMTD.lib(wassert.obj) definiert.
    MSVCRTD.lib(MSVCR90D.dll) : error LNK2005: _floor ist bereits in LIBCMTD.lib(_floor_pentium4_.obj) definiert.
    MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) ist bereits in LIBCMTD.lib(typinfo.obj) definiert.
    MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) ist bereits in LIBCMTD.lib(typinfo.obj) definiert.
    LINK : warning LNK4098: Standardbibliothek "MSVCRTD" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.

    Also dass Sachen doppelt benannt seien. Aber wie kann das plötzlich auftreten? Und was kannich dagegen tun.. Ich hab nur OpenGL in VC eingebunden, da ich ein Programm kompilieren wollte, das OpenGL verwendet, das hat dann nicht funktioniert. Dann wollte ich mein altes Programm wieder laufen lassen und schwups... Die obigen Fehler kommen 😞
    Ich weiß nicht, was ich machen soll!

    Kann mir jemand bitte helfen 😕

    Viele Grüße und dankeschön,
    Jan



  • Du compilierst dein Projekt mit anderen Einstelungen für die C/C++-Laufzeitbibliothek (CRT) als das .obj-File compiliert wurde.

    Für die CRT gibt es die folgenden (coneinander unabhängigen) Einstellungen:
    DEBUG oder RELEASE
    DLL oder LIB
    Single oder Multi-Threaded

    (Wenn ich mich recht entsinne, ist Single-Threaded ist mit VC9 oder so weggefallen).

    Was jetzt passiert:

    Lösung 1: Dein prohjekt mit den gleichen Einstellungen wie libnoise kompilieren. Ist nicht unbedingt möglich, da MFC auf jeden fall Multithreaded verlangt, und die DLL/LIB-Einstellung von der Einstellung für MFC-Bibliotheken festgelegt wird.

    Lösung 2: hat libnoise ein übersetztes .obj-File, das zu deinen Einstellungen passt?

    Lösung 3: LibNoise mit für dein projekt passenden Einstellungen kompilieren.

    Wenn C++ doch nur endlich - endlich! - ein zeitgemäßes build- und bibliotheks-Management bekommen würde!


Anmelden zum Antworten