einbinden von MFC



  • Hallo,
    ich habe vorkurzen einen fremden Thread zum Thema "einbinden von MFC" für meine Frage genutzt. Dort hat sie wohl leider keiner gesehen, weshalb ich sie nun nochmals so stelle.

    Beim Einbinden von MFC in Projekten, bei denen ich zusätzlich noch einige andere (meist selbsterstellten) libs einbinde, bekomme ich öfters Linkerfehler (wie bereits definiert).Ich wurstel es meist immer so hin, dass es wieder geht. Ich würde aber gerne wissen, wie man es richtig macht und es auch so angeht, dass man in Zukunft möglichst wenig Probleme habe.

    Im aktuellen Fall komm ich auch gar nicht weiter. Bekomme z.B. LNK2005, Funktionen wurden schon in msvcprtd.lib und in MSVCRTD.lib definiert.

    Bei mir steht #include "stdafx.h" auch immer ganz am Anfang!

    Normalerweise stell ich dann oft das einbinden der MFC von statisch auf dynamisch oder umgekehrt um.

    Bei meinem aktuellen Problem lässt sich durch diese "Strategie" aber leider nicht lösen.

    Ich habe hier eine Entwicklungsumgebung von dem ich ein Feature nutzen will. Dazu liegt ein Sample-Code bei. In der Docu steht schon, dass man sich die Einstellungen des Samples ansehen soll, da Projektteile die benötigt werden mit Visual Studios 2003 kompiliert wurden (ich habe Visual Studios 2008).

    Also habe ich mir ein neues Programm angelegt, alle Einstellungen des Projektes so übernommen, wie es im Sample ist (in den Optionen die bei VisualStudios 2008 kommen, wenn ich auf den Projektnamen rechts klicke und dann auf Eigenschaften).

    Habe die stdafx.h so angepasst, dass auch die gleich ist. Das Programm ansich macht bis jetzt noch nichts.

    Wenn ich es dann kompilieren will kommen die Linkerfehler! Obwohl alles genauso ist wie im Sample (zumindest auf den ersten Blick, vielleicht ist irgend wo was versteckt was ich nicht finde). Nun weiß ich nicht, wieso die bei mir kommen und beim Sample nicht.

    Wenn ich hingegen bei meinem Programm die mfc auf dynamisch stelle (ist beim Sample statisch), kompiliert er aber bekomme direkt beim Starten
    "Eine Anwendung hat versucht, die C-Laufzeitbibliothek nicht ordnungsgemäß zu laden. Wenden Sie sich für weitere Informationen an das für die Anwendung zuständige Supportteam"

    Weiß grad nicht weiter.

    würde mich über Tipps freuen


  • Mod

    Ein paar mehr detailierte Infos wäre nett.

    1. Deine LIBs und Deine EXE müssen immer die gleiche CRT Einstellung benutzen (DLL oder statisch)
    2. Beachte, dass bei der Verwednung der MFC die Includes der MFC (Afx.h) immer vor allen anderen Includes stehen.
    3. Zu R6034: Du hastr die Runtime nicht korrekt installiert:
    http://blog.m-ri.de/index.php/2007/03/14/grunde-fur-den-r6034-bei-der-vc-80-dll-crt/



  • ich gebe gerne mehr Informationen, da aber nicht viel im Projekt bis jetzt ist, weiß ich nicht was noch relevant ist. Kannst gerne speziell fragen.

    Der Sample-Code wurde mit VisualStudios 2003 erstellt, weshalb ich dazu gezwungen wurde, es in ein VS 2008 Projekt zu konvertieren.

    Ich habe mit der stdafx grad bisschen rum gespielt und die includes in den verschiedensten Reihenfolgen probiert, weshalb ich nun genaueres sagen kann (die includes habe ich alle aus dem Beispiel übernommen).

    Es wird kein afx.h eingebunden sondern windows.h (habe es mal mit afx.h testweise gemacht, da komme ich zu den gleichen Ergebnissen):
    Die stdafx.h sieht wie gefolgt aus:

    #pragma once
    
    #ifndef VC_EXTRALEAN
    	#define VC_EXTRALEAN
    #endif
    
    #ifndef _WSPIAPI_H_
    	#define _WSPIAPI_H_ 
    #endif
    #ifndef _WINSOCKAPI_
    	#define _WINSOCKAPI_ 
    #endif
    #include <windows.h>
    
    WINBASEAPI BOOL WINAPI TryEnterCriticalSection(IN OUT LPCRITICAL_SECTION lpCriticalSection);
    
    #ifdef _MSC_VER
       #pragma warning(disable:4100)
       #pragma warning(disable:4512)
    #endif
    
    #ifdef _MSC_VER
       #pragma warning(disable:4100)
       #pragma warning(default:4512)
    #endif
    
    #include "HeaderDateiVonEntwicklungsumgebung1.h"
    #include "HeaderDateiVonEntwicklungsumgebung2.h"
    

    Fehlermeldungen:
    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.
    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.
    fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.

    Wenn ich die Zeile #include "HeaderDateiVonEntwicklungsumgebung2.h" weglasse, kann ich kompilieren.

    Wenn ich alle includes (+ WINBASEAPI BOOL...) weglasse, bis auf #include "HeaderDateiVonEntwicklungsumgebung2.h" bekomme ich exakt die gleichen Fehlermeldungen wie mit den anderen includes.

    Das waren alles versuche mit mfc als statische lib (da das sample-file satische mfc hat geh ich davon aus, dass die anderen damit auch kompiliert werden und wie du schon sagst, muss alles gleich kompiliert werden).
    Habe trotzdem mal auf dynamische mfc-lib gestellt.
    Dann kompiliert er und er führt es aus - aber nur solange ich keine Klasse verwende. Sobald ich eine Klasse der includes verwende, wird die dll geladen (kamen erst ständig Fehlermeldungen dass die dlls fehlen. Da ich keine Adminrechte habe und den Path auf das Verzeichnis stellen kann, hab ich alle dlls in meinen Ordner kopiert. Und es kam wieder die Fehlermeldung R6034.
    Da ich vielleicht irgend was nicht mit rüber geholt hatte warf ich einfach mal den kompletten Inhalt des Debug-Ordners meines Programmes in den Ordner in dem die dlls ursprünglich waren (und von dem sie auch vom Sample-Code eingebunden wurden). Hab die exe Datei ausgeführt und zack, wieder die Fehlermeldung.

    Also habe ich mich durch deine Seite gelesen (danke dafür) und bei

    if (manifest is in the same folder as the dll)
      return TRUE;
    

    bin ich ins überlegen gekommen. Muss jede dll die ich einbinde ein eigenes Manifest haben? Oder reicht es, wenn mein Programm eine richtiges Manifest hat (das von VisualStudios 2008 bei mir erstellt wird).
    Wenn das erstere der Fall ist, hab ich folgende Vermutung:
    Mit VS 2003 wurde noch nicht immer ein Manifest erstellt - wenn ich mich nicht irre - und da die dlls angeblich mit VS2003 gemacht wurden, haben die sowas nicht.

    Jetzt ist meine Vermutung: Ich kann die libs und dlls die mit VS2003 erstellt wurden nicht unter VS2008 verwenden. Wenn doch, wie soll ich am besten vorgehen?

    Und zweitens:
    Da die mfc ja eigentlich im Sample-Code statisch eingebunden wurde, sollte ich das auch irgend wie machen. Leider weiß ich nicht wie ich bei dem LNK2005 weiter vorgehen soll.

    Danke für deine Hilfe!!!


Anmelden zum Antworten