Zum Inhalt springen

VC++6 macht Ärger: LNK2001 nichtaufgelöstes externes Symbol...


Empfohlene Beiträge

Geschrieben

Hallo,

nun saß ich gestern den halben Tag an diesem Fehler und alle Ansatzpunkte, die ich kenne, hab ich mittlerweile ausgeschöpft. :rolleyes:

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

Geschrieben

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?

Geschrieben

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.

Geschrieben
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?

Geschrieben
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.

Geschrieben
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?

Geschrieben
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:

Geschrieben
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.

Geschrieben

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.

Geschrieben

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. :(

Geschrieben
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?

Geschrieben

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



Geschrieben

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. :(

Geschrieben

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?

Geschrieben
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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...