managed Module in C++/CLI?



  • hallo,
    ich habe mit VS 2008 und der option /clr:oldsyntax aus 2 managed dateien (header + cpp datei) eine dll gebastelt. diese dll möchte ich nun in eine neues projekt einbinden, das mit unmanaged code, also C++/CLI in VS 2008 geschrieben werden soll. Nach dem Verbinden der DLL mit dem Linker bekomme ich aber die Meldung

    Error 1 fatal error LNK1302: only support linking safe .netmodules; unable to link ijw/native .netmodule

    Ich habe dann irgendwo den Hinweis gelesen, die DLL mit der Option /clr:safe zu compilieren aber das geht ja nicht, weil die Sorcen managed sind und der Compiler dann automatisch auf /clr:oldsyntax geht. Ich habe dann in einem Forum gelesen die obj-Datei stattdessen einzubinden, was aber zu über 600 Linkerfehlern führt, z.B.

    Error 1 error LNK2005: "public: bool __thiscall YCompoundFiles::Block::IsOpen(void)" (?IsOpen@Block@YCompoundFiles@@QAE_NXZ) already defined in filename.obj

    Die Sourcen nach unmanaged zu migrieren, wäre zu aufwendig. Wie kann ich denn managed C++ code in C++/CLI verwenden? Danke schonmal.



  • Das ist zwar jetzt nicht genau dein Problem - aber der zweite Linker error sagt lediglich das du funktionen die du in der dll neu hinzufügst in einer anderen Lib schonmal deklariert hast - sprich du müsstes die andere Lib (die die gleichen Funktionen mitbringt) vom Linker excluden - dann bist du zumindest die 600 Fehler los...



  • Danke für Deine Antwort. Ich verstehe den 2. Fehler schon, aber der macht leider (zumindest für mich) wenig Sinn, weil ich keine andere lib,dll,obj ins Projekt gefügt habe. 😕



  • Managed DLLs werden nicht gelinkt. Diese werden per Referenz an das Projekt gebunden.

    Der 2. Fehler kommt, weil Du eine Definition in 2 Units hast. Jede Unit (.cpp) wird für sich alleine Übersetzt und später vom Linker zusammengeführt. Hast Du die Definition nun in einem Header, den Du in mehreren Units includierst, wird jede dieser Units seine eigene Definition bekommen. Der Linker, der alles unter einen Hut bringen soll, weiß nun nicht, welche Definition er verwenden soll.



  • Okay, ich weiss in etwa was Du meinst, aber nicht so recht was ich nun ändern soll. Mit "Definiton" meinst Du "Klassen-Definiton" oder?

    Managed DLLs werden nicht gelinkt. Diese werden per Referenz an das Projekt gebunden.

    ... aber trotzdem muss der compiler doch wissen, dass diese vorhanden ist, wenn ich sie referenzieren will?

    Hast Du die Definition nun in einem Header, den Du in mehreren Units includierst, wird jede dieser Units seine eigene Definition bekommen. Der Linker, der alles unter einen Hut bringen soll, weiß nun nicht, welche Definition er verwenden soll.

    ...dafür gibt es doch "#pragma once" oder? hab ich verwendet.



  • Zitat:

    Hast Du die Definition nun in einem Header, den Du in mehreren Units includierst, wird jede dieser Units seine eigene Definition bekommen. Der Linker, der alles unter einen Hut bringen soll, weiß nun nicht, welche Definition er verwenden soll.

    ...dafür gibt es doch "#pragma once" oder? hab ich verwendet.

    Nicht die Deklaration (Header) sondern die Definition.
    Da gibts wohl doch was doppelt.



  • Nachdem ich definition <-> deklaration mal falsch gelernt hab, bin ich immer sehr unsicher.

    Nicht die Deklaration (Header) sondern die Definition.

    War das jetzt die Korrektur des Textes weiter oben oder meintest Du damit was anderes ? 😕


Anmelden zum Antworten