Veröffentlicht 3. Dezember 200915 j 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
3. Dezember 200915 j 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?
3. Dezember 200915 j 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.
3. Dezember 200915 j 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?
3. Dezember 200915 j 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.
3. Dezember 200915 j 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?
3. Dezember 200915 j 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:
3. Dezember 200915 j 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.
3. Dezember 200915 j 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.
3. Dezember 200915 j Kannst du mal ein Testprojekt anlegen, das nichts weiter tut als diese Funktion zu importieren und aufzurufen?
3. Dezember 200915 j 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!
3. Dezember 200915 j 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.
3. Dezember 200915 j 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?
3. Dezember 200915 j 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
3. Dezember 200915 j Ist die sowohl im Problem-Projekt als auch im Testprojekt vorhanden? Und falls ja, ist sie gleich?
3. Dezember 200915 j Ich hab die .def noch nie angefasst, und in beiden Projekten ist immer nur die .lib enthalten... Muss ich die .defs auch mit einbinden?
3. Dezember 200915 j Muss ich die .defs auch mit einbinden? Wenn es auch ohne die .def-Datei funktioniert, nicht.
3. Dezember 200915 j 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.
3. Dezember 200915 j 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?
3. Dezember 200915 j 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.
3. Dezember 200915 j 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
3. Dezember 200915 j _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.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.