none
wsprintf RRS feed

  • Frage

  • Hallo zusammen...

    Folgende Situation: ich habe ein C++/CLI Projekt (Klassenbibliothek)... da drin habe ich eine Funktion gebaut und rufe "wsprintf" auf. Des weiteren binde ich eine lib im Projekt ein, welche native C++ enthält und ebenfalls "wsprintf" aufruft.

    Wenn ich das Projekt kompiliere, erhalte ich ein LNK2020 für das wsprintf, welches ich im C++/CLI Projekt aufrufe und ein LNK2019 für das wsprintf (__imp_wsprintfW) aus dem native Projekt.

    Binde ich die native Lib in ein Native Projekt ein, wird das ganze normal gelinkt. Daher jetzt meine Fragen:

    1) Wieso der LNK2019? Wieso muss ich explizit "User32.lib" linken in einem C++/CLI Projekt? liegt das an einem Konfigurationsfehler oder ist das einfach so? Kann ich also nie davon ausgehen, dass die Win32-API-Libs gelinkt werden, wenn ich ein C++/CLI Projekt baue? Muss ich alles manuell dazulinken?

    2) Wieso der LNK2020? Ist wsprintf, aufgerufen in einem C++/CLI Projekt was anderes als wenn ich's native aufrufe? Immerhin verwende ich es ja auch um in einen nativen Puffer zu schreiben?

    PS: Mein Ziel ist es, das ganze komplett zu verstehen. Ich will NICHT ein Projekt zum Laufen bringen! Ich will auch NICHT, dass irgendwas kompiliert. Ich will VERSTEHEN was hinter dieser Sache steckt und wie Microsoft das Zeug gebaut hat, damit es jetzt zu diesem Verhalten kommt.

    Rudolf

    Dienstag, 28. August 2012 14:38

Alle Antworten

  • Binde ich die native Lib in ein Native Projekt ein, wird das ganze normal gelinkt.

    In der native LIB steht drin, dass er die "user32.lib" dazulinken muss (compiliere mal mit /VERBOSE dann siehst Du das... oder verwende "dumpbin /ALL" auf Deine LIB, dann siehst Du die Referenzen).

    1) Wieso der LNK2019? Wieso muss ich explizit "User32.lib" linken in einem C++/CLI Projekt?

    Per default wird in einem C++/CLI Projekt keine user32.LIB hinzugefügt; C++/CLI ist nur für InterOp (mit anderen native Dingen) und nicht für InterOp mit Win32; das geht auch (meist) direkt aus C# heraus.
     > 2) Wieso der LNK2020?

    2020 kommt, wenn der Linker Fehler durch Meta-Daten verursacht wird. Da Du ein C++/CLI Projekt gemacht hast, hast Du IL-Code erzeugt, welcher die entsprechenden Metadaten enthält. Siehe auch ildasm...

    Ist wsprintf, aufgerufen in einem C++/CLI Projekt was anderes als wenn ich's native aufrufe?

    Ja. Du rufst es via eine InterOp Schicht auf, die der Compiler automatisch einfügt; alternativ kannst Du "#pragma unmanaged" für den Bereich machen, dann bekommst Du auch wieder LNK2019, anstelle von LNK2020 ;)

    Immerhin verwende ich es ja auch um in einen nativen Puffer zu schreiben?

    Das hat nichts damit zu tun. IL kann auch "native" Puffer darstellen...

    PS: Mein Ziel ist es, das ganze komplett zu verstehen.

    Na dann viel Spass ;)


    Jochen Kalmbach (MVP VC++)
    Dienstag, 28. August 2012 19:19
  • Binde ich die native Lib in ein Native Projekt ein, wird das ganze normal gelinkt.

    In der native LIB steht drin, dass er die "user32.lib" dazulinken muss (compiliere mal mit /VERBOSE dann siehst Du das... oder verwende "dumpbin /ALL" auf Deine LIB, dann siehst Du die Referenzen).

    1) Wieso der LNK2019? Wieso muss ich explizit "User32.lib" linken in einem C++/CLI Projekt?

    Per default wird in einem C++/CLI Projekt keine user32.LIB hinzugefügt; C++/CLI ist nur für InterOp (mit anderen native Dingen) und nicht für InterOp mit Win32; das geht auch (meist) direkt aus C# heraus.

    >> yup, das ist mir klar mit der Referenz... meine Frage war wohl etwas ungenau: Wenn da schon 'ne Referenz drin ist, wieso dann der LNK2019 ? hätte das heissen müssen ... :-)

    ... *hmm* scheinbar, weil die Standard-Libs nicht wirklich vermerkt werden ... ok, dann ist alles klar -> jede noch so kleine Win32 API Sache, die ich aus C++/CLI nutzen will, ohne irgend einen Zwischencode, muss ich explizit einbinden. Das passt schon ... ist sowieso nicht meine Lieblingssprache :-)

    >> das andere zum 2020 hatte ich mir schon fast gedacht... danke für die Info

    Rudolf


    Dienstag, 28. August 2012 19:50