LittleArwen Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 Hallo, nun saß ich gestern den halben Tag an diesem Fehler und alle Ansatzpunkte, die ich kenne, hab ich mittlerweile ausgeschöpft. Die Funktion bzw das Symbol, wonach er sucht, ist in einer proprietären Bibliothek enthalten. Diese hab ich schon mehrfach woanders verwendet, mit Erfolg. Ich hab mir die Fortschrittsinformationen des Linkes ausgeben lassen, bis auf eine einzige Funktion findet er alle. Genau diese, hab ich im Hexeditor nachgeprüft, steht da auch drin, sowohl deklariert als auch definiert. Ich vermute, dass irgendwas mit den Aufrufkonventionen nicht stimmt. Aber so tief stecke ich noch nicht in C++ drin, daher wollte ich da nicht unüberlegt rangehen. Der Quellcode ist auch nicht von mir. Ich muss ihn anpassen und "zum laufen kriegen". Meine IDE ist (leider) MS VC++ 6, und ich muss auf Windows XP SP 2entwickeln. Ich habe Folgendes versucht: Bibliotheken im Code über #pragma comment einbinden. Bibliotheken über die Projekteinstellungen einbinden. Sie noch zusätzlich manuell zum Projekt hinzufügen. Das Bibliotheksverzeichnis in den Projekteinstellungen zuerst ohne und dann mit ".\" angegeben. Was gibt es noch, um diesen Fehler wegzukriegen? Hab ich was übersehen? Viele Grüße, Arwen Zitieren
Klotzkopp Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 Zeig bitte die Signatur der Funktion und die genaue Fehlermeldung des Linkers. Zitieren
LittleArwen Geschrieben 3. Dezember 2009 Autor Geschrieben 3. Dezember 2009 Oh, sorry. parameter.obj : error LNK2001: Nichtaufgeloestes externes Symbol _PNIO_rec_write_req Debug/vs06_profidrive_v4.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise Das wäre die Meldung des Linkers. Meinst du mit Signatur die Deklaration aus dem Header oder die gesamte Implementierung der Funktion? Zitieren
Klotzkopp Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 Die Signatur ist die Deklaration. Zitieren
LittleArwen Geschrieben 3. Dezember 2009 Autor Geschrieben 3. Dezember 2009 PNIO_UINT32 PNIO_CODE_ATTR PNIO_rec_write_req( PNIO_UINT32 Handle, /* in */ PNIO_ADDR * pAddr, /* in */ PNIO_UINT32 RecordIndex, /* in */ PNIO_REF ReqRef, /* in */ PNIO_UINT32 Length, /* in */ // max. Laenge 480 Byte PNIO_UINT8 * pBuffer); /* in */ Ich bin mir nicht sicher, ob das allein hilft... Der Code ist ziemlich tief geschachtelt. Zitieren
Klotzkopp Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 Die Funktion bzw das Symbol, wonach er sucht, ist in einer proprietären Bibliothek enthalten. Diese hab ich schon mehrfach woanders verwendet, mit Erfolg.Hast du die Bibliothek schon erfolgreich verwendet, oder diese Funtion? Ich bin mir nicht sicher, ob das allein hilft... Der Code ist ziemlich tief geschachtelt. Ich wollte nur ausschließen, dass das ein C++-Symbol ist und irgendwas wegen falscher Parametertypen nicht passt. Aber das Symbol ist undekoriert, reines C. Welche Aufrufkonvention hast du in deinem Projekt eingestellt? Zitieren
LittleArwen Geschrieben 3. Dezember 2009 Autor Geschrieben 3. Dezember 2009 Hast du die Bibliothek schon erfolgreich verwendet, oder diese Funtion? Sowohl, als auch. Ich wollte nur ausschließen, dass das ein C++-Symbol ist und irgendwas wegen falscher Parametertypen nicht passt. Aber das Symbol ist undekoriert, reines C. Welche Aufrufkonvention hast du in deinem Projekt eingestellt? Derzeit ist /GZ eingestellt, also der stdcall. Zitieren
Klotzkopp Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 Derzeit ist /GZ eingestellt, also der stdcall.Eigentlich sollte das keine Linkerfehler verursachen, aber hast du das mal zum Test auf cdecl umgestellt? Bist du ganz sicher, dass nicht irgendwoher eine alte Version der Importbibliothek geholt wird? Zitieren
LittleArwen Geschrieben 3. Dezember 2009 Autor Geschrieben 3. Dezember 2009 Eigentlich sollte das keine Linkerfehler verursachen, aber hast du das mal zum Test auf cdecl umgestellt? Bist du ganz sicher, dass nicht irgendwoher eine alte Version der Importbibliothek geholt wird? Danke für den Tipp, ich hab das jetzt mal versucht. Hat leider keinen Erfolg gebracht. Also ich hab die Bibliothek von Hand in das Projektverzeichnis kopiert und dann diese Stelle angegeben. Was mir aber eben noch einfällt: Ich habe noch 2 dlls mit demselben Namen. Vllt hab ich mir die durch zuviel Rumspielen zerschossen... Wobei ich nicht wüsste, wie. :confused: Zitieren
Hexagon Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 Was mir aber eben noch einfällt: Ich habe noch 2 dlls mit demselben Namen. Vllt hab ich mir die durch zuviel Rumspielen zerschossen... Wobei ich nicht wüsste, wie. :confused: Verwendung unterschiedlicher DLL-Versionen? Funktionen die in einer version drin sind müssen in der anderen nicht zwingend enthalten sein. Am besten per Rechtsklick im Explorer mal die Dateiversionsnummern vergleichen. Zitieren
LittleArwen Geschrieben 3. Dezember 2009 Autor Geschrieben 3. Dezember 2009 Hm, die Versionsnummern sind identisch. Also so langsam kommt mir das komisch vor. Vllt kontaktiere ich mal den Entwickler. Oder ich installiere zu Testzwecken den GNU-Compiler, ursprünglich wurde das Ganze unter KDevelop 3 entwickelt. Aber ich kann mir nicht vorstellen, dass es daran liegt. Der Compiler meckert ja nicht (mehr). Oder ich schreibe alle cpp-Files neu. Zitieren
Klotzkopp Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 Kannst du mal ein Testprojekt anlegen, das nichts weiter tut als diese Funktion zu importieren und aufzurufen? Zitieren
LittleArwen Geschrieben 3. Dezember 2009 Autor Geschrieben 3. Dezember 2009 Das wär noch ne Idee. Das mach ich gleich mal. Kann zwar ein bisschen dauern weil ich viel drumrumbasteln muss, aber ich hab ja Zeit. Ich werde berichten, ob es geklappt hat, danke! Zitieren
LittleArwen Geschrieben 3. Dezember 2009 Autor Geschrieben 3. Dezember 2009 So, nun hab ich mir ein kleines Testprojekt erstellt, in dem ich nur die Funktion teste. Bis auf einen kleinen Speicherfehler :floet: läuft das, also es wird alles korrekt gebunden. Die Funktion wird gefunden. Also wird es nicht an der Bibliothek liegen, denke ich. Zitieren
Klotzkopp Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 Also wird es nicht an der Bibliothek liegen, denke ich. Nein, dann ist es mit hoher Wahrscheinlichkeit ein Problem in den Projekteinstellungen. Du könntest mal die .dsw- und .dsp-Dateien des Problem-Projekts und des Testprojekts mit einem Textvergleichstool abgleichen, ob da irgendwas auffällt. Hast du eigentlich eine .def-Datei für die Bibliothek? Zitieren
LittleArwen Geschrieben 3. Dezember 2009 Autor Geschrieben 3. Dezember 2009 Ja, hab eine .def-Datei gefunden. Ich kann sie mal posten. EXPORTS PNIO_CP_set_appl_watchdog @1 PNIO_CP_trigger_watchdog @2 PNIO_CP_register_cbf @3 PNIO_CP_set_opdone @4 PNIO_CP_cycle_stat @5 PNIO_CP_cycle_info @6 PNIO_data_test @7 PNIO_controller_open @11 PNIO_device_activate @12 PNIO_set_mode @13 PNIO_rec_read_req @14 PNIO_rec_write_req @15 PNIO_ctrl_diag_req @16 PNIO_controller_close @17 PNIO_data_read @18 PNIO_output_data_read @19 PNIO_data_read_cache_refresh @20 PNIO_data_read_cache @21 PNIO_data_write @22 PNIO_data_write_cache_flush @23 PNIO_data_write_cache @24 PNIO_register_cbf @26 PNIO_device_open @41 PNIO_set_appl_state_ready @42 PNIO_device_ar_abort @43 PNIO_device_close @44 PNIO_device_start @45 PNIO_device_stop @46 PNIO_set_dev_state @47 PNIO_api_add @48 PNIO_api_remove @49 PNIO_mod_pull @50 PNIO_sub_pull @51 PNIO_sub_plug @52 PNIO_sub_plug_ext @53 PNIO_mod_plug @55 PNIO_build_channel_properties @56 PNIO_diag_channel_add @57 PNIO_diag_channel_remove @58 PNIO_diag_generic_add @59 PNIO_diag_generic_remove @60 PNIO_diag_ext_channel_add @61 PNIO_diag_ext_channel_remove @62 PNIO_process_alarm_send @63 PNIO_diag_alarm_send @64 PNIO_ret_of_sub_alarm_send @65 PNIO_initiate_data_read @66 PNIO_initiate_data_read_ext @67 PNIO_initiate_data_write @68 PNIO_initiate_data_write_ext @69 PNIO_sub_plug_ext_IM @70 Zitieren
Klotzkopp Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 Ist die sowohl im Problem-Projekt als auch im Testprojekt vorhanden? Und falls ja, ist sie gleich? Zitieren
LittleArwen Geschrieben 3. Dezember 2009 Autor Geschrieben 3. Dezember 2009 Ich hab die .def noch nie angefasst, und in beiden Projekten ist immer nur die .lib enthalten... Muss ich die .defs auch mit einbinden? Zitieren
Klotzkopp Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 Muss ich die .defs auch mit einbinden? Wenn es auch ohne die .def-Datei funktioniert, nicht. Zitieren
LittleArwen Geschrieben 3. Dezember 2009 Autor Geschrieben 3. Dezember 2009 Mir ist gerade aufgefallen, dass in meiner .lib hinter der Funktion steht: @24 In der .def steht aber @15. Das hat nichts zu bedeuten, oder? Sry für das dauernde Rumgestochere, ich bin gerade sowas von ratlos. Zitieren
Klotzkopp Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 Schau dir mal mit Depends die DLL an. Welche Nummer hat die Funktion da? Zitieren
LittleArwen Geschrieben 3. Dezember 2009 Autor Geschrieben 3. Dezember 2009 Ordinalzahl der Funktion ist 15, laut Depends. Er gibt mir aber ne Warnung aus: At least one module has an unresolved import due to a missing export function in a delay-load dependent module. Im Teilfenster drüber ist die MPR.dll rot markiert. Als ich mir dann diese in einem Extrafenster angesehen hab, zeigte er mir im Teilfenster oben rechts die Funktion WNetRestoreConnectionA mit einem roten C-Symbol an (ich hab mit dem Tool noch nie gearbeitet, daher die umständliche Bezeichnung der Fenster - das werde ich mir später mal genauer ansehen). Hab ich da was relevantes gefunden? Zitieren
Klotzkopp Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 Hab ich da was relevantes gefunden? Nein, das ist bekannt und kein Problem. Siehe Dependency Walker Frequently Asked Questions (FAQ), 2. Frage. Wie schaust du dir denn die .lib an? Wo siehst du dieses @24? Denn so sieht es ja danach aus, als ob die Dll nicht zur Lib passt. Zitieren
LittleArwen Geschrieben 3. Dezember 2009 Autor Geschrieben 3. Dezember 2009 Wie schaust du dir denn die .lib an? Wo siehst du dieses @24? Denn so sieht es ja danach aus, als ob die Dll nicht zur Lib passt. Im Hexeditor guck ich mir die an. Da steht überall, wo der Funktionsname steht, Folgendes: _PNIO_rec_write_req@24__imp__PNIO_rec_write_req@24 Zitieren
Klotzkopp Geschrieben 3. Dezember 2009 Geschrieben 3. Dezember 2009 _PNIO_rec_write_req@24__imp__PNIO_rec_write_req@24 Das ist das Name Mangling für stdcall. Die 24 ist nicht der Export-Ordinal, sondern die Größe der Funktionsparameter in Bytes. Also doch kein Problem hier. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.