C++/CLI und boost threads



  • Hallo!

    Ich habe eine Anwendung entwickelt in der ich die Thread-Bibliothek von boost für meinen unmanaged C++-Code verwende. Jetzt habe ich die Anwendung auf mein Laptop übertragen, allerdings funktioniert die Anwendung dort nicht. Das Compilieren und Linken funktioniert bis auf ein haufen Warnungen keine Probleme (die nur besagen das __fastcall ignoriert wird bzw. nach __stdcall konvertiert wird). Allerdings kommt auf dem Laptop beim Start der Anwendung eine Fehlermeldung das die Anwendung nicht initialisiert werden konnte.

    Mein PC hat als OS Win2k mit VS 2005 (ohne SP1) und mein Laptop (mit Core 2 Duo) hat WinXP Media Center Edition (also Prof.) und hat VS 2005 (mit SP1) installiert. Leider habe ich die Anwendung nicht versucht zu compilen und auszuführen auf dem Laptop bevor ich das SP1 eingespielt habe.

    Ich habe zumindest beobachtet das es reicht wenn ich einen Teil der Thread-Bibliothek von Boost include (ohne sie zu verwenden), ab da kommt die Fehlermeldung. Auf dem System ohne SP1 funktioniert alles problemlos, ich kann die fertige Anwendung auch auf meinen Laptop kopieren und benutzen. Nur kann ich die Anwendung nicht benutzen, wenn ich sie auf dem Laptop erstellt habe. Ich habe auch schon versucht boost neu zu bauen auf dem Lappi und dann die Anwendung zu erstellen, was leider nicht funktioniert hat.

    Ich wollte die Anwendung eigentlich nicht auf MFC umschreiben damit ich sie auch außerhalb meines PCs entwickeln kann, da besonders die Möglichkeiten für die GUI in .NET einfach bequemer sind. 🙂

    Meine Frage ist jetzt eigentlich nur ob jemand dieses Verhalten bestätigen kann oder sonst irgendeinen Hinweis zu diesem Problem hat (außer das ich auf boost::thread verzichten soll oder die Anwendung einfach nicht auf dem Laptop entwickeln soll).

    Greetz



  • Zusammenfassend könnte man also sagen das Du irgendein Problem mit der boostlib hast ?

    Lässt sich die Anwendung in der Entwicklungsumgebung starten ? Wenn ja, wo bleibt die Anwendung stehen ? Unterschiede zwischen Debug und Release und das ganze noch mal beim starten ausserhalb der Entwicklungsumgebung ?

    (Auch wenn ich es für unwarscheinlich halte das es Dir hilft:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-156654.html )



  • Die Boost-Thread DLL hast aber schon mitkopiert?

    Die Meldung deutet häufig auf fehlende DLLs hin.



  • Also wenn ich ohne SP1 compile und es dann auf meinen Laptop schiebe funktioniert die Anwendung. Also die Anwendung funktioniert immer wenn ich ohne SP1 compiled habe. Ich habe das Projekt dann auf den Laptop kopiert wo SP1 installiert ist und die Anwendung dort compiled. Egal ob ich die Anwendung (die mit VS SP1 compiled wurde) aus VS starte oder nicht kommt nur die Fehlermeldung "Die Anwendung konnte nicht initialisiert werden. Klicken Sie auf OK um die Anwendung zu beenden." (und es gibt auch nur den OK-Button). Also die Fehlermeldung kommt bevor ich irgendwas anderes sehen kann. Habe auch schon in der main-Funktion an die erste mögliche Stelle einen Breakpoint gesetzt der nicht erreicht wird (was vllt. durch folgende Beschreibung noch logisch wird).
    Die Anwendung wirft im Release-Modus noch eine System.TypeInitialisationException. Bei weitere Informationen steht leider nicht welches Modul, sondern nur das eine ungefangene Ausnahme in '<Modul>' aufgetreten ist. Das Modul das die Ausnahme wirft war (bin jetzt leider auf der Arbeit und kann nicht nachsehen, bin mir aber recht sicher) mscoree.dll. Dazu kommt im Ausgabefenster noch eine Meldung nach der ich auch schon im Internet gesucht habe aber nichts gefunden habe.
    Was mich auch irritierte war, dass ich bei der Version ohne SP1 in den Linkereinstellungen (Eingabe) in der Option "Symbolverweise erzwingen" noch __DllMainCRTStartup@12 hinterlegen musste (Grund steht hier (auch wenn mein Projekt keine DLL, sondern ne Exe ist): http://support.microsoft.com/kb/814472) damit die Anwendung funktioniert. Aber egal ob ich dies in der Version mit SP1 angebe oder nicht es kommt die gleiche Fehlermeldung und nur mit Sachen aus boost/thread. Z.B. boost/regex funktioniert ohne Probleme, also auch bei der Version mit SP1.

    Ich werde heute Abend nochmal ein paar mehr Informationen (bezüglich der Ausgabe während des Programmlaufs) posten, wenn ich wieder am Projekt sitze, freue mich aber dennoch über jede hilfreiche Antwort. Und Danke an die die bereits geholfen haben. 🙂

    @LordJaxom:
    Ich werde heute abend einfach mal die Boost-Thread DLL ins entsprechende Verzeichnis kopieren und es ausprobieren.

    Greetz



  • Hi!

    Also ich habe das jetzt eben nochmal getestet und die DLL dorthin kopiert, aber hat nichts gebracht (was mich auch gewundert hätte, immerhin gehts wenn ich die Thread-Lib nicht benutze). Ich habe jetzt hier auch nochmal die Ausgabe die der Debugger während des Programmlaufs macht:

    "Client.exe": "C:\WINDOWS\system32\ntdll.dll" geladen, Keine Symbole geladen.
    "Client.exe": "C:\WINDOWS\system32\mscoree.dll" geladen, Keine Symbole geladen.
    "Client.exe": "C:\WINDOWS\system32\kernel32.dll" geladen, Keine Symbole geladen.
    "Client.exe": "C:\WINDOWS\system32\advapi32.dll" geladen, Keine Symbole geladen.
    "Client.exe": "C:\WINDOWS\system32\rpcrt4.dll" geladen, Keine Symbole geladen.
    "Client.exe": "C:\WINDOWS\system32\mscoree.dll" entladen.
    Debugger: Eine nicht behandelte und nicht mehr ausführbare Ausnahme wurde während des Ladeprozesses ausgelöst
    Das Programm "[4088] Client.exe: Systemeigen" wurde mit Code -1073741701 (0xc000007b) beendet.

    Ich weiß zwar nicht was jetzt los ist, aber ich habe gestern nochmal ein paar Änderungen, sowohl in den Einstellungen als auch am Source, am PC gemacht (also beim VS ohne SP1) und eben das Projekt nochmal kopiert. Die Debug-Version erzeugt obige Ausgabe und den gleichen Fehler, die Release-Version scheint jetzt zu funktionieren aufm Lappie (compiliert mit dem VS mit SP1).

    Naja, vielleicht habe ich dann noch irgendeinen Fehler in den Einstellungen in der Debug-Version. Ich werde das mal weiter beobachten und mich notfalls nochmal hier melden. Danke soweit für eure Hilfe. 🙂

    Greetz



  • Hast Du mal ein vollständigen Recompile gemacht ?



  • Klar (so lange die Anwendung noch so klein ist und es nicht länger als 30 Sekunden dauert mache ich eigentlich immer ein recompile), auch schon die debug und release Ordner gelöscht und dann neu erstellt.
    Hatte bis jetzt keine Zeit weiter zu machen, werd mich aber gleich oder später nochmal ransetzen.

    Greetz



  • Hallo!

    Achja, was mir noch eingefallen ist, sich aber wohl erledigt haben dürfte ist das ich grundsätzlich keine vorkompilierte Header verwende, aber glaube kaum das es damit was zu tun haben könnte?
    Wie dem auch sei, ich habe versucht Einstellungen aus dem Release-Modus zu übernehmen mittlerweile habe ich im Debug-Modus unter "Eigenschaften->Konfigurationseigenschaften->Allgemein->Komplette Programmoptimierung", als einzige veränderte Einstellung zu vorher, "Link-Zeitcodegenerierung verwenden" (Option /GL; nur auf Empfehlung der MSDN2 habe ich noch in der Linker-Optimierung /ltcg aktiviert) aktiviert und jetzt geht es.

    Wenn mir jetzt noch jemand erklären kann wieso das jetzt was gebracht hat (mich würde schon interessieren warum ich das machen musste und nicht nur das ich es machen musste)? 🙄
    Link zur MSDN zur Option /GL: http://msdn2.microsoft.com/de-de/library/0zza0de8(VS.80).aspx
    Kann es sein das eine LIB mit /GL compiled wurde und deshalb die Anwendung mit /GL compiled werden muss? Würde mir allerdings nicht so wirklich einleuchten wieso das beim VS ohne SP1 ging und jetzt nicht mehr...

    Edit:
    Ich glaub ich hab da was gefunden. Werde mir das nochmal ansehen, ansonsten lass ich es ^^:

    http://msdn2.microsoft.com/de-de/library/xbf3tbeh(VS.80).aspx schrieb:

    Wenn Sie /LTCG verwenden und mainCRTStartup neu definieren, kann die Anwendung unvorhergesehenes Verhalten zeigen, das auf die Ausführung von Benutzercode vor Initialisierung globaler Objekte zurückzuführen ist. Es gibt drei Möglichkeiten, dieses Problem zu beheben: Definieren Sie mainCRTStartup nicht neu, kompilieren Sie die mainCRTStartup enthaltende Datei mit /LTCG, oder initialisieren Sie globale Variablen und Objekte nach Möglichkeit statisch.

    Greetz


Anmelden zum Antworten