LNK2001, MFC & Ordnerstruktur

  • Hallo Leute..

    Gleich vorweg :-), ja ich hab nach so einem Problem gegoogelt, aber leider vergebens. Also ich hab' folgendes Problem: Hab' ein MFC-Projekt in VC++ .NET welches diverse Libraries (opengl32.lib, glu32.lib, glpng.lib glpngd.lib) benoetigt. Meine Ordnerstruktur schaut folgendermaszen aus:

    Code
    MyAppFolder
     |---libs (Ordner mit: opengl32.lib, glu32.lib, glpng.lib glpngd.lib)
     |---source files (befinden sich im direkt im Ordner 'MyAppFolder')


    D.h. ich moechte z.B. nicht auf die Windows-eigenen OpenGL-*.lib-Files zugreifen, sondern alles, was dieses Projekt benoetigt, in einen Ordner (libs) geben.

    Ich hab versucht mittels #pragma-directives dem Compiler mitzuteilen, dass die angegebenen Libraries benoetigt werden und wo sie zu finden sind mittels:

    Code
    #pragma comment(lib, "libs/opengl32.lib")
    #pragma comment(lib, "libs/glu32.lib")
    #pragma comment(lib, "libs/glpng.lib")
    #pragma comment(lib, "libs/glpngd.lib")


    Das Problem: Der Linker bemaengelt, dass er die bestimmte OpenGL-Befehle nicht finden kann, also Fehlermeldungen wie:

    Code
    error LNK2001: unresolved external symbol __imp__glClear@4
    error LNK2001: unresolved external symbol __imp__glClearColor@16
    error LNK2001: unresolved external symbol __imp__glEnable@4
    ...


    was wohl nichts anderes heiszt, als, dass die Libraries nicht gefunden werden koennen.

    Meine Frage: Habe ich das mit der #pragma-Direktive falsch verstanden? Wenn ja, wie gehoert es richtig wenn ich so eine Ordnerstruktur habe?

    Bin fuer jeden Tipp dankbar..
    ciao..

  • Hallo..

    Zitat von Ringding

    Und wieso nicht die .lib nehmen, die beim VC++ dabei ist?


    Weil ich nicht nur die OpenGL-libs benoetige sondern auch andere, u.A. glpng, die nicht automatisch bei VC++ dabei sind und da hab' ich dasselbe Problem.

    Darueber hinaus, soll ich eine Applikation abliefern, die alle libraries mitenthaelt, auf die ich auch zugreifen soll.

    Zitat von Ringding


    Ist diese .lib, die du da hast, überhaupt für diese VC-Version geeignet?


    Soweit ich weisz ja. Hab' damit einige Consolen-Applikationen geschrieben und da hat's funktioniert.

    ciao..

  • Zitat von \LaTeX

    Darueber hinaus, soll ich eine Applikation abliefern, die alle libraries mitenthaelt, auf die ich auch zugreifen soll.

    Und wo hört nun "alle Libraries" auf? OpenGL gehört zum Betriebssystem, und es kann soundso nicht statisch zum Projekt dazugelinkt werden.

    Wenn's in einem anderen Projekt funktioniert, dann kannst du ja so lange die Unterschiede zwischen beiden Projekten Stück für Stück angleichen, bis es geht.

  • OK.. danke.. hab das Problem nun fast geloest (hab in den Project Preferences die Library-Namen angegeben). Hab' allerdings schon wieder ein anderes. Jetzt bekomme ich die Fehlermeldungen:

    Code
    error LNK2005: ___argc already defined in libcmtd.lib(crt0dat.obj)
    error LNK2005: ___argv already defined in libcmtd.lib(crt0dat.obj)
    error LNK2005: ___crtExitProcess already defined in libcmtd.lib(crt0dat.obj)


    Hab mal danach gegoogelt und laut MS KB kann dieser Linkerfehler dadurch entstehen, wenn CRT Libraries vor dem MFC Libraries gelinkt verden:
    http://support.microsoft.com/default.aspx?s…&NoWebContent=1
    Hab auch den Loesungsweg 1 von dieser Adresse probiert, der lautet:

    Zitat

    Solution One: Force Linker to Link Libraries in Correct Order
    (1) On the Build menu, click Settings.
    (2) In the Settings For view of the Project Settings dialog box, click to select the project configuration that is getting the link errors.
    (3) On the Link tab, click to select INPUT in the Category combo box.
    (4) In the Libraries to Ignore box, insert the library names (for example, Nafxcwd.lib;Libcmtd.lib). Note The linker command-line equivalent in /NOD:<library name>.
    (5) In the Object/library Modules box, insert the library names. You must make sure that these are listed in order and as the first two libraries in the line (for example, Nafxcwd.lib Libcmtd.lib).


    aber ich weisz nicht, welche Libraries ich beim Punkt (4) ignorieren soll, damit die MFC's vor den CRT's gelinkt werden (mit den angegebenen Nafxcwd.lib und Libcmtd.lib gehts nicht). Kann mir da wer einen Tipp geben?

    Dank im Voraus..
    ciao..

  • Lass dir vom Linker ein map-File erzeugen, dann siehst du, welche Libs er verwendet. Wäre es aber nicht besser, einfach die dynamische C++ Runtime zu verwenden? Dadurch müsste das Problem auch verschwinden.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!