Linkerfehler: nichtaufgelöstes externes Symbol (LNK2019)
-
Hallo,
ich habe ein Problem bei der Programmierung einer Messkarte. Vom Hersteller wurde dazu eine dll geliefert, die sich über ein Installationsprogramm installierte. Die dazugehörige lib-Datei habe ich unter Linker - (Eingabe) eingebunden. Unter MS Visual C++ 6.0 in der Debug-Version funktioniert das ganze super. In der Release-Version kann der Linker die obj-Dateien nicht binden, da er nicht aufgelöste extere Symbole findet. Jetzt bin ich auf .net umgestiegen und da funktionierts nicht mal in der Debugversion. Kann man da mit irgendwelchen Einstellungen bei Compiler und Linker das Problem in den Griff bekommen?
Die Fehlermeldung sieht unter .net etwa so aus:Ressourcen werden kompiliert...
Verknüpfen...
Testdialog.obj : error LNK2019: Nicht aufgelöstes externes Symbol '_DRV_DeviceOpen@8', verwiesen in Funktion '"public: void __thiscall CTestdialog::OnBnClickedTest(void)" (?OnBnClickedTest@CTestdialog@@QAEXXZ)'
Debug/Test.exe : fatal error LNK1120: 1 unaufgelöste externe VerweiseDabei ist DRV_DeviceOpen() eine Funktion, die aus der dll geladen werden muss.
-
Ich glaube das hier könnte dir weiter helfen
-
Servus jungs
no prob!!
Probiers mal damit:
1. Erzwing mal die ausgabe datei
2. setz die ip deiner messkarte auf dll
3. Stimmt die lib in der linker version überein mit der dll datei des compilers
4. einbinden von lib dateien ist prinzipiell schlecht versuch sie über den systemordner und die windows einstellungen als versteckte zugriffs libary der c++ microsoft visual compiler version zu assemblieren
5. drv_deviceopen() muß auf jeden fall aus der windowsxp.dll geladen werden wenn das nicht geht probier die scsshr.dll umzuleiten auf die node name scada libary von microsoftIch denke das problem hat sich erledigt
hey no problem
nix zu danken
cu
-
c++freak schrieb:
Servus jungs
no prob!!
Probiers mal damit:
1. Erzwing mal die ausgabe datei
2. setz die ip deiner messkarte auf dll
3. Stimmt die lib in der linker version überein mit der dll datei des compilers
4. einbinden von lib dateien ist prinzipiell schlecht versuch sie über den systemordner und die windows einstellungen als versteckte zugriffs libary der c++ microsoft visual compiler version zu assemblieren
5. drv_deviceopen() muß auf jeden fall aus der windowsxp.dll geladen werden wenn das nicht geht probier die scsshr.dll umzuleiten auf die node name scada libary von microsoftIch denke das problem hat sich erledigt
hey no problem
nix zu danken
cuIch glaube nicht. Ich muss dazu sagen, dass die Messkarte noch für den ISA-Bus ist. Der PC, auf dem die läuft, ist ein Industrie-PC, der nur eine ISA-Backplane besitzt. Die Karte wird derzeit auf der Adresse 220h betrieben. Kann vielleicht da das Problem liegen? Bisher wurde die Karte unter DOS (Pascal-Programm) angesteuert.
Die dll und die lib sind vom Hersteller. Diesen habe ich auch wegen diesem Problem kontaktiert, habe aber keine Antwort bekommen. Von Punkt 4 oder 5 verstehe ich leider gar nichts, da ich noch nicht so lange Windows-Programme schreibe.
Außerdem erklärt das nicht, warum es trotzdem in der Debug-Version von Visual C++ 6.0 geht und in den anderen Varianten nicht.
-
Hast du in den Projekteinstellungen zur Release-Version denn die entsprechenden lib-Dateien auch eingetragen?
-
dEUs schrieb:
Hast du in den Projekteinstellungen zur Release-Version denn die entsprechenden lib-Dateien auch eingetragen?
Danke für den Tipp, genau das war der Fehler.
Böse Falle, hätte ja selbst drauf kommen müssen. Jetzt läuft es zumindest unter MS Visual C++ 6.0 in beiden Versionen. Allerdings unter .net hab ich keine Chance es zum Laufen zu bekommen. Warscheinlich kommt .net nicht mit der dll klar, die offensichtlich nur für die version 6.0 geschrieben worden ist. Aber sollten höhere Versionen eines Programms (hier der Entwicklungsumgebung) nicht auch abwärtskompatibel sein? Gibt es eine Möglichkeit unter .net quasi konform der Version 6.0 zu arbeiten?
-
Normalerweise sollte es keine Probleme damit geben. Was genau sind denn die Probleme?
-
dEUs schrieb:
Normalerweise sollte es keine Probleme damit geben. Was genau sind denn die Probleme?
Das was ich unter dem ersten Eintrag geschrieben habe. Hier nochmal die der Screenshot des Ausgabefensters:
------ Neues Erstellen gestartet: Projekt: Test, Konfiguration: Debug Win32 ------
Die Zwischen- und Ausgabedateien für das Projekt "Test" mit der Konfiguration "Debug|Win32" werden gelöscht.
Kompilieren...
stdafx.cpp
Kompilieren...
TestView.cpp
TestDoc.cpp
Testdialog.cpp
d:\Programmierung\Test\Testdialog.cpp(43) : warning C4244: '=': Konvertierung von 'LRESULT' in 'DWORD', möglicher Datenverlust
Test.cpp
MainFrm.cpp
Code wird generiert...
Ressourcen werden kompiliert...
Verknüpfen...
Testdialog.obj : error LNK2019: Nicht aufgelöstes externes Symbol '_DRV_DeviceOpen@8', verwiesen in Funktion '"public: void __thiscall CTestdialog::OnBnClickedTest(void)" (?OnBnClickedTest@CTestdialog@@QAEXXZ)'
Debug/Test.exe : fatal error LNK1120: 1 unaufgelöste externe VerweiseDas Build-Protokoll wurde unter "file://d:\Programmierung\Test\Debug\BuildLog.htm" gespeichert.
Test - 2 Fehler, 1 Warnung(en)---------------------- Fertig ----------------------
Neues Erstellen: 0 erfolgreich, 1 fehlgeschlagen, 0 übersprungen
Ich habe zum Test eine SDI-Anwendung geschrieben, in der ich mir einen modalen Dialog aufrufe. In dessen konstruktor wird die Karte initialisiert (Setzen der DeviceNumber, holen des DriveHandles), im Destruktor wieder freigegeben. Dann habe ich einen Button, der eine Messung machen soll.
Unter 6.0 funktionierts jetzt wie gesagt in beiden Versionen, unter .net (der gleiche Quellcode) kommt das was da oben steht (hier habe ich der Einfachheit halber das Initialisieren und Schließen der Karte nicht im Konstruktor/Destruktor realisiert, sondern in die Memberfunktion des Buttons gelegt).
Habe mir auch nochmal die neuesten Treiber vom Hersteller aus dem Netz geholt.
-
Die libs wieder angegeben?
-
dEUs schrieb:
Die libs wieder angegeben?
Ich glaub ich hab den Fehler gefunden. Ich hatte die lib unter dem Punkt "Modul zur Assembly hinzufügen" eingetragen und das funktionierte nicht. Jetzt habe ich mal ein bissl probiert. Wenn man die lib unter "Zusätzliche Abhängigkeiten" einträgt macht er es fehlerfrei. Oh je, .net ist ein wenig gewöhnungsbedürftig für mich. Aber trotzdem vielen Dank, hast mir sehr weiter geholfen.
Komischerweise misst die Karte manchmal totalen Mist. Das war damals bei dem DOS-Programm auch schon so. Man muss mehrfach den entsprechenden Kanal abfrage und der Maximalwert ist denn dem eigentlichen Messwert am nächsten. Komisch, komisch... aber nur so bekomm ich richtige Werte.