debug und releas version, visual studio 2005
-
hallo,
es gibt ja ein debug und ein releas version. wenn ich die debug exe nehm und sie auf einem rechner ohne visual studio 2005 ausführen möchte, gibt es fehler im programm, die es aber auf dem rechner auf dem es kompiliert oder visual studio drauf ist nicht gibt. deswegen wollt ich eine releas version erstellen. das problem ist aber, das bei der releas version fehler kommen: "Nicht aufgelöstes externes Symbol...", aber beim debug version kommt beim kompilieren kein fehler.
mfg sascha
-
und was hat das mit ANSI C zu tun?

-
Dann unterscheiden sich deine Projekt-Einstellungen für die Release-Version von denen, die du für die Debug-Version eingestellt hast. Vergleiche die beiden im Projekteinstellungs-Dialog (einfach immer über die Listbox umschalten). Du wirst wahrscheinlich in den Linker-Settings eine lib eingetragen haben, die im Release-Build fehlt o.ä.
-
supertux schrieb:
und was hat das mit ANSI C zu tun?

Ehrlich!

Das ist schon eine Zumutung, daß das ANSI-Kommitee, das für
die formale Definition von ANSI-C zuständig war, nicht die
speziellen Bedürfnisse von Visual Studio 2005 - Benutzern bei
Debug- und Release-Versionen berücksichtigt hat.Die sollten sich was schämen

-
Dieser Thread wurde von Moderator/in Nobuo T aus dem Forum ANSI C in das Forum MFC (Visual C++) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Nicht aufgelöstes externes Symbol...",
Bekommen wir noch etwas mehr?

(bitte nicht mehr als zehn Zeilen, Stück für Stück...)Die Fehlermeldung bedeutet normalerweise, daß bestimmte Bibliotheken nicht gefunden werden. Entweder stimmen Einstellungen in der Release-Konfiguration nicht, oder Dir fehlen die Release-Bibliotheken.
________________________________
Liebe-ANSI-C-Wichtel, ein enfaches "Falsches Forum" hätte auch genügt und wäre genau so unfreundlich gewesen.
-
die releas exe wird jetzt erstellt, aber wenn ich sie ausführen möchte gibt es bei den meisten funktionen ein fehler(programm stürtz ab). bei der debug version ist das nicht der fall, da geht alle so wie ich es möchte.
an was liegt das?
-
-
sascha191088 schrieb:
die releas exe wird jetzt erstellt, aber wenn ich sie ausführen möchte gibt es bei den meisten funktionen ein fehler(programm stürtz ab). bei der debug version ist das nicht der fall, da geht alle so wie ich es möchte.
an was liegt das?Ich glaube, das kann daran liegen, dass du z.B. über Feldgrenzen hinaus schreiben willst o.ä. Für die Debug-Version wird der Speicher irgendwie vorbereitet, so dass diese u.U. 'robuster' ist.
Ich denke, du solltest mal ein bisschen mehr Informationen 'rausrücken. Sonst kann man dir schlecht helfen. "Programm stürzt ab" ist keine ausreichende Fehlerbeschreibung. Poste mal den genauen Fehlertext und versuche, den Fehler zu lokalisieren (in der Release-Version z.B. mit MessageBoxen oder einem Logfile).
Du kannst die Debug-Version übrigens auch auf einem Rechner ohne VS ausführen. Du musst nur die Debug-DLLs kopieren. Der Dependency Walker verrät dir auch, welche das sind. Trotzdem ist dein Programm natürlich auch in der Debug-Version fehlerhaft und du solltest die Fehler aufspüren und beseitigen.
-
vielen dank für deine hilfe, der fehler kommt bei einer funktion bei den ich mehrer fread nacheinander benutze:
void kunden_daten_auflisten(HWND hwnd_list){ FILE *stream; char *ptr_char; char zeichen; char ptr_zahl1[20]; char ptr_zahl2[20]; void *ptr_buffer; char buffer_firma[LAENGE_FIRMA]; int i; for(i=0;i<LAENGE_FIRMA;i++){ buffer_firma[i]='\0'; } stream = fopen(VERZEICHNIS, "r+b"); zeichen = getc(stream); fseek(stream,-1,SEEK_CUR); if(zeichen!=EOF){ do{ fread(kunde_objekt.firma,20,sizeof(char),stream); fread(kunde_objekt.strasse,20,sizeof(char),stream); fread(&kunde_objekt.nummer,sizeof(int),1,stream); fread(&kunde_objekt.plz,sizeof(int),1,stream); fread(kunde_objekt.ort,sizeof(char),20,stream); fread(kunde_objekt.ansprechspartner,sizeof(char),20,stream); fseek(stream,1,SEEK_CUR); zeichen = getc(stream); fseek(stream,-1,SEEK_CUR); if(strcmp(kunde_objekt.firma,buffer_firma)){ _itoa_s(kunde_objekt.nummer,ptr_zahl1,10); _itoa_s(kunde_objekt.plz,ptr_zahl2,10); ptr_char = cmb(kunde_objekt.firma, ", "); ptr_char = cmb(ptr_char, kunde_objekt.strasse); ptr_char = cmb(ptr_char, ". "); ptr_char = cmb(ptr_char, ptr_zahl1); ptr_char = cmb(ptr_char, ", "); ptr_char = cmb(ptr_char, ptr_zahl2); ptr_char = cmb(ptr_char, ", "); ptr_char = cmb(ptr_char, kunde_objekt.ort); ptr_char = cmb(ptr_char, ", "); ptr_char = cmb(ptr_char, kunde_objekt.ansprechspartner); ptr_buffer = backChar(ptr_char); SendMessage(hwnd_list, LB_ADDSTRING, 0, (LPARAM) (LPCSTR) ptr_buffer); } }while(zeichen!=EOF); } fclose(stream); }kunde kunde_objekt ist eine globale variable.
wenn ich nur das erste fread mach und die anderen rauskommentiere, geht es aber es wird natürlich nicht alle daten angezeigt.Diese beide funktioen sind zum anfügen und umwandeln, der strings.
char* cmb(char*str1,char *str2) { char * tmp; int lenght, i,k; lenght = strlen(str1) + strlen(str2); tmp = (char*) malloc(lenght); for( i=0; i<strlen(str1); i++) tmp[i] = str1[i]; k=i; for( i=0; i<strlen(str2); i++){ tmp[k] = str2[i]; k++; } tmp[k]= 0; return tmp; } void *backChar(char* str){ int lenght, i, j; char *tmp; lenght = strlen(str); tmp = (char*)malloc( 2* lenght +2); j=0; for( i=0; i<lenght; i++) { tmp[j]= str[i]; j++; tmp[j]=0; j++; } tmp[j]=0; j++; tmp[j]=0; return tmp; }struktur sieht so aus:
#define LAENGE_FIRMA 20 #define LAENGE_STRASSE 20 #define LAENGE_ANSPR 20 #define LAENGE_ORT 20 typedef struct kunde{ char firma[LAENGE_FIRMA]; // Name der Firma char strasse[LAENGE_STRASSE]; // Straßennamen der Firma int nummer; // Hausnummer der Firma char ort[LAENGE_ORT]; // Ort der Firma int plz; // Postleitzahl der Firma char ansprechspartner[LAENGE_ANSPR]; // Ansorechspartner } kunde;der datei aufbau sie so aus:
Firmennamen(20*char)Strasse(20*char)Hausnummer(int)PLZ(int)Ort(20*char)Ansprechspartner(20*char)\n
ohne leerzeichen dazwischen.bei einer anderen stelle kommen die fehler bei itoa() funktion.
-
Auf den ersten Blick fällt mir auf, dass die Funktionen cmb und backChar Speicher allozieren. Wird der auch irgendwann freigegeben? Besser wäre es wahrscheinlich, den Zielstring auch als Argument zu übergeben. So kannst du den Speicher dort, wo er alloziert wird, auch wieder freigeben. Das wird aber nicht dein Problem sein.
Leider hast du den Fehlertext immer noch nicht gepostet. Ich kann dir daher nur raten, das Programm schrittweise zu durchlaufen (F10/F11) und die genaue Absturzstelle zu lokalisieren. Beim Absturz siehst du ja eigentlich schon, an welcher Stelle es passiert ist. Überprüfe, ob in deiner Struktur gültige Werte stehen, oder ob sich vielleicht etwas "verschoben" hat. Ist denn auch sichergestellt, dass in der Datei immer gleichlange Zeilen vorkommen (auch in der letzten)?
Ich könnte mir auch vorstellen, dass die fehlende, abschließende Null bei deinen Strings ein Problem ist. Du liest z.B. in Kunde.ort (char[20]) 20 Zeichen ein. Für eine abschließende Null ist da kein Platz mehr. Du wendest dann aber Funktionen darauf an, die damit ein Problem haben könnten. strlen orientiert sich meines Wissens nach der abschließenden Null und sollte ohne diese bestenfalls ein falsches Ergebnis liefern. Ist alles nur eine Vermutung, ich bin mir da auch nicht sicher, ohne zu testen. Aber ich halte diese Möglichkeit für wahrscheinlich. Also mache deine Strings einfach ein wenig größer und initialisiere sie mit Nullen.
-
hi,
hab den fehler jetzt
, ist die cmb(), backChar() funktion. der speicher wird nicht wieder frei gegeben, der in den funktionen reserviert wird.vielen dank an alle die mir geholfen haben.
mfg sascha