Forum: PC-Programmierung Visual Studio - Linken von C-Code


von max .. (vbc2011)


Lesenswert?

Hallo,

ich habe folgendes Problem bei einem MS Visual Studio 2008 Projekt.

Ich möchte eine Funtion aus einer LIB verwenden.
Wenn ich nur die LIB in meinem Projekt linke - bekomme ich ein 
Lesezugriffsfehler beim Aufruf der Funktion. Linke ich jedoch den C-Code 
der Funktion (also das .c-File in welchem die Funktin definiert ist) 
direkt in mein Projekt, funktioniert die ganze Sache einwandfrei!

Hat da viell. jemand ein Idee - wo da das Problem liegt ?

Danke schonmal
Gruss

von Peter II (Gast)


Lesenswert?

verschiende compiler einstellungen von der lib und dem andere Projekt.

von max .. (vbc2011)


Lesenswert?

...das war auch mein erster Gedanke - und das wäre wohl auch 
nachvollziehbar. Aber daran liegt es wohl nicht - ich habe die 
Projekteinstellung verglichen.

Es muss irgendwie am linken liegen...

von RTFM (Gast)


Lesenswert?

Warum zeigst Du uns nicht mal die Fehlermeldung? Zu geheim?

Geraten: Die Referenz auf Dein LIB-Projekt fehlt.

von max .. (vbc2011)


Lesenswert?

Hi,
hier mal die Fehlermeldung vom VisualStudio.


Unbehandelte Ausnahme bei 0x00410ace in fft.exe: 0xC0000005: 
Zugriffsverletzung beim Schreiben an Position 0x00485fbc.


Dieser Fehler kommt nicht wenn ich den C-Code der aufgerufenen Funktion 
direkt in mein Projekt linke. Es ist ja auch so - das der direkt 
gelinkte Code vorrang hat - vor der LIB.

von Peter II (Gast)


Lesenswert?

wechsle mal in den ASM code und schau was da passiert.

Was für Paramter hat die funkiontion? Hast du es mal mit einer ganz 
einfachen funktion getestet

int test(int a ) { return a; };

von max .. (vbc2011)


Lesenswert?

...ich verwende auch andere Funktionen aus der gleichen LIB. Die laufen 
einwandfrei...

An RTFM -> was meinst du mit " Die Referenz auf Dein LIB-Projekt fehlt." 
?

von RTFM (Gast)


Lesenswert?

Vergiß das mit der Referenz, es handelt sich ja tatsächlich um einen 
Laufzeitfehler, nicht um einen Fehler beim Linken. Da war ich etwas zu 
schnell.

Bei solch "mystischem" Verhalten könnte ich mit noch Abhängigkeiten zw. 
globalen Datenelementen vorstellen, da die Init.-Reihenfolge undefiniert 
ist, können da häßliche - zufällige - Laufzeitfehler aufteten. Ist aber 
auch nur ins Blaue geraten.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Laufzeitfehler lassen sich problemlos mit dem Debugger lokalisieren 
- warum schrecken so viele Leute davor zurück, den zu benutzen?

von max .. (vbc2011)


Lesenswert?

Guten Morgen,

ich kann mir nur nicht erklären - warum die Funktion bei anderen 
Projekten funktioniert - wenn sie nur über die LIB gelinkt ist (dies 
würde heißen - es liegt an meinen Projekteinstellungen) ?!?!

Andererseits - funktioniert es ja wenn die Funktion direkt gelinkt ist 
(also nicht über die LIB) ! !

Ich habe soeben herausgefunden - das ich einen Header bzw. noch eine LIB 
gelinkt habe - welche als C++ komiliert sind -> linke ich diese nicht 
tritt kein Fehler auf ! ! !

Somit wissen wir wo der Fehler herkommt - wie kann ich das trotzdem 
unter einen Hut bringen ?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ich kann nur nochmal auf meinen Beitrag von gerade eben verweisen. Nutze 
den Debugger. Der hilft.

Ansonsten solltest Du auch mal allmählich etwas mehr über Deine 
Projekteinstellungen verraten - ist das ein C-Projekt, oder ist das ein 
C++-Projekt? In was für einer Datei ist main() bzw. winmain() zu finden?

Und was ist das für eine Library, wie ist die übersetzt?

von max .. (vbc2011)


Lesenswert?

Das mit dem C++ gedöns lässt sich nicht reproduzieren.

Also zu den Projekteinstellungen:

- es ist ein C-Projekt
- wird als __cdecl (/Gd) (C-code kompiliert)
- es werden keine libs ignoriert bzw. speziell gelinkt

was könnte noch ein Anhaltspunkt sein ?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Tja, was hindert Dich daran, den Debugger zu verwenden?

von max .. (vbc2011)


Lesenswert?

was sehe ich denn beim debuggen - woraus ich auf einen Fehler schließen 
kann - beim debuggen tritt der Fehler genauso auf (beim Einsprung in die 
Funktion)! !

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

max .. schrieb:
> was sehe ich denn beim debuggen

Den Stack, ob sich irgendwelche Variablen im Umfeld verändert haben, 
etc.

Und Du siehst, exakt wo in der Funktion aus der Library was 
schiefgeht.

Und wenn Du von Deinem Projekt einen Debug-Build machst, kannst Du 
erweiterte Prüfoptionen aktivieren, Code zum Stacktest beispielsweise, 
Code, der überprüft, ob der Heap korrumpiert wird etc.

von max .. (vbc2011)


Lesenswert?

"Disassembly"- Mode sehe ich genau die Stelle der Funktion - wo der 
Fehler passiert.
Die Funktion heißt "MESS_Write_CSV" (schreibt eine CSV-Datei)

MES_Write_CSV("CSV.csv", ";", "%f", &Status, 1, "Values", &MessArray);
00429AAB  lea         eax,[ebp-11ACh]
00429AB1  push        eax
00429AB2  push        offset string "Values" (47300Ch)
00429AB7  push        1
00429AB9  lea         ecx,[ebp-0BCh]
00429ABF  push        ecx
00429AC0  push        offset string "%f" (473008h)
00429AC5  push        offset string ";" (473004h)
00429ACA  push        offset string "CSV.csv" (472FF8h)
00429ACF  call        @ILT+1410(_MES_Write_CSV) (426587h) // hier 
krachts
00429AD4  add         esp,1Ch

...sehe ich das richtig - genau da wo auf die Funktion im Speicher 
zugegriffen werden soll - geh was schief ?!

von max .. (vbc2011)


Lesenswert?

Also - das Problem ist gelöst.

Warum es jetzt funktioniert und vorher nicht ist mir allerdings nicht 
klar!
Ich habe alle LIBs einfach "schrittweise" neu in das Projekt gelinkt - 
d.h. die LIBs entfernt - die dazugehörigen Funktionen auskommentiert, 
kompiliert und dann schrittweise die zugehörigen LIBs zu den Funktionen 
wieder dazu gelinkt, einkommentiert und kompliliert - jetzt sieht mein 
Projekt so aus wie vorher - läuft aber super !?!? :)

Aber trotzdem danke an die vieln Tipps :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.