Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Linkerfehler: Nichtaufgeloestes externes Symbol (war: Error)

Empfohlene Antworten

Veröffentlicht

Ich habe eine funktion in eine Header die will ich abrufen so:

CNameApp name

	name.init_benutzer();

kriege ich Fehler

error LNK2001: Nichtaufgeloestes externes Symbol

was muss ich machen damit es funk ????

Hi,

ich gehe mal davon aus das die Funktion in der Headerdatei deklariert ist und sich

die Definition in einer DLL Datei befindet. Wenn das so ist, dann bedeutet der

Fehler das der Linker die Funktion in den Angegebenen .Lib Dateien nicht finden

kann. Du mußt also einfach dem Linker noch die entsprechende Lib Datei

angeben.

EDIT: Die Boardsuche hätte dir übrigens auch geholfen;)

Gruß

Guybrush

  • Autor
Originally posted by Guybrush Threepwood

Hi,

ich gehe mal davon aus das die Funktion in der Headerdatei deklariert ist und sich

die Definition in einer DLL Datei befindet. Wenn das so ist, dann bedeutet der

Fehler das der Linker die Funktion in den Angegebenen .Lib Dateien nicht finden

kann. Du mußt also einfach dem Linker noch die entsprechende Lib Datei

angeben.

Gruß

Guybrush

Ne eigentlich ist es so, dass die Funktion sich in eine exe befindet und rufen will ich sie in eine DLL

Originally posted by 007ski

Ne eigentlich ist es so, dass die Funktion sich in eine exe befindet und rufen will ich sie in eine DLL

Das funktioniert so nicht, weil der Linker nicht weiß, wo in der Exe-Datei der Einsprungpunkt für diese Klasse/Funktion ist. Das lässt sich auch nicht zur Laufzeit auflösen. Das geht nur bei Aufrufen von EXE nach DLL.

Außerdem ist es schlechtes Design, eine DLL von einer EXE abhängig zu machen. Das widerspricht ja der Absicht, die hinter DLLs steht.

Du könntest aber in der DLL eine Funktion exportieren, mit der du einen Zeiger auf eine CNameApp-Instanz oder einen Funktionszeiger angeben kannst.

  • Autor
Originally posted by Klotzkopp

Du könntest aber in der DLL eine Funktion exportieren, mit der du einen Zeiger auf eine CNameApp-Instanz oder einen Funktionszeiger angeben kannst.

Sorry aber es überschreibt meine Möglichkeiten, kannst Du bitte mit es mit code zeigen ;()

PS

Die DLL rufe ich aber dynamisch in exe auf

Also, das mit einem Instanzzeiger geht nicht, weiß auch nicht, wie ich darauf gekommen bin. Aber mit einem Funktionszeiger gehts:

In der EXE:

void do_init_benutzer()

{

CNameApp name

name.init_benutzer();

}

// irgendwo am Anfang:

// der DLL den Funktionszeiger übergeben.

set_do_init_benutzer( do_init_benutzer );

In der DLL:

// Funktionszeiger

void(*fp_init_benutzer)(void);

// exportierte Funktion zum Setzen des Funktionszeigers

void __declspec(dllexport) set_do_init_benutzer_fp( void(*fp)(void) )

{

fp_init_benutzer = fp;

}

Dann kannst du in der DLL mit

fp_init_benutzer();

die Funktion in der EXE aufrufen.

Originally posted by 007ski

ja richtig

Mal abgesehen davon das es offentsichtlich nicht ohne weiteres Möglich ist, ist das

meiner Meinung nach absolut unsaubere Programmierung.

Wenn die DLL auf Variablen in deiner Exe zugreifen soll, dann übergib sie doch

einfach als Parameter an die DLL. Funktionen in deiner Exe solltest du eh nur in

deiner Exe aufrufen.

Gruß

Guybrush

  • Autor
Originally posted by Guybrush Threepwood

Mal abgesehen davon das es offentsichtlich nicht ohne weiteres Möglich ist, ist das

meiner Meinung nach absolut unsaubere Programmierung.

ja richtig ;)

Originally posted by Guybrush Threepwood

Wenn die DLL auf Variablen in deiner Exe zugreifen soll, dann übergib sie doch

einfach als Parameter an die DLL. Funktionen in deiner Exe solltest du eh nur in

deiner Exe aufrufen

Sorry aber wie kann ich ein Parameter in meinem fall Cstring an die DLL übergeben

  • Autor

Ich habe eine Funktion in DLL

void xyDlg::getstr(CString &str)

{

}

dann rufe ich in exe mit

AfxLoadLibrary() die DLL

Und mit GetProcAddress die Funktion und dann .....

Irgend wie fehlt mir Idee bitttttte um Hilfe !?!?!?

Originally posted by 007ski

Ich habe eine Funktion in DLL

void xyDlg::getstr(CString &str)

{

}

dann rufe ich in exe mit

AfxLoadLibrary() die DLL

Und mit GetProcAddress die Funktion und dann .....

Du kannst nichtstatische Member nur aufrufen, wenn Du in der Exe eine Instanz von xyDlg (oder einen Zeiger darauf) hast.
  • Autor
Originally posted by Klotzkopp

Du kannst nichtstatische Member nur aufrufen, wenn Du in der Exe eine Instanz von xyDlg (oder einen Zeiger darauf) hast.

Also dass was Guybrush Threepwood gesagt hat stimmt nicht ?

Originally posted by 007ski

Also dass was Guybrush Threepwood gesagt hat stimmt nicht ?

Auf welche Aussage von Guybrush Threepwood beziehst du das? Soweit ich das sehe, hat er nichts falsches gesagt.

Exportierst du denn überhaupt die Klasse xyDlg oder die Methode getstr?

Wo wird die Instanz von xyDlg erzeugt?

  • Autor
Originally posted by Guybrush Threepwood

Doch:D, im allgemeinen schon. Nur das was du da versuchst ginge nur

wenn du in deiner EXE das Objekt von deiner xyDLG Klasse erstellen würdest,

oder du eben einen Zeiger darauf hättest.

ok jetzt passt

Danke Klotzkopp und Guybrush Threepwood

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.