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.

[C++] Linker probleme. Scheinbar werden die symbole nicht richtig exportiert.

Empfohlene Antworten

Veröffentlicht

Hi leute,

ich war gerad am erweitern meines Cpp Frameworks und wollte kurz eine Klasse testen.

Ergo fix die ne neue Consolen Anwendung erstellt und die Pfade für die Header und Lib files in den Projekteigenschaften eingetragen.

So jetzt habe ich noch die entsprechende Header Datei includiert. (und die entsprechende Lib eingebunden).

So weit so gut. Ich konnte auf alle Elemente zugreifen.

Das sieht dann wie folgt aus:


#pragma comment (lib, "Win32.System.lib")



#include "stdafx.h"


#include <Win32\System\wThread.h>

#include <iostream>


using namespace std;


void TestFunction();

System::Threading::wThread* thread;

int _tmain(int argc, _TCHAR* argv[])

{

	try

	{	

		thread = new System::Threading::wThread(TestFunction);

		if (thread->Start())

		{

			while (thread->IsRunning())

			{

				Sleep(1000);

			}

		}

	}

	catch(ExceptionBase base)

	{

			cout << base.GetMessageW() << endl;

	}


	return 0;

}



void TestFunction()

{

	for (int i = 0; i<=1000; i++)

	{

		cout << "Position" << " State ==> " << i << endl;

	}

}

Als ich den code aber compilieren wollte hab ich folgende Fehler bekommen:
Fehler 2 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: bool __thiscall System::Threading::wThread::Start(void)" (?Start@wThread@Threading@System@@QAE_NXZ)" in Funktion "_wmain". E:\Programmierung\Cpp\LibTestConsole\LibTestConsole\LibTestConsole.obj Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: bool __thiscall System::Threading::wThread::IsRunning(void)" (?IsRunning@wThread@Threading@System@@QAE_NXZ)" in Funktion "_wmain". E:\Programmierung\Cpp\LibTestConsole\LibTestConsole\LibTestConsole.obj Fehler 3 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall System::Threading::wThread::wThread(void (__cdecl*)(void))" (??0wThread@Threading@System@@QAE@P6AXXZ@Z)" in Funktion "_wmain". E:\Programmierung\Cpp\LibTestConsole\LibTestConsole\LibTestConsole.obj Fehler 4 error LNK1120: 3 nicht aufgelöste externe Verweise. E:\Programmierung\Cpp\LibTestConsole\Debug\LibTestConsole.exe 1
Der Inhalt der wThread.h Datei sieht wie folgt aus:

#pragma once

#pragma comment (lib, "Kernel32.lib")

#pragma comment (lib,"hException.lib")

#include<Windows.h>

#include <Base\baseDef.h>

#include <hException\ExceptionBase.h>

#include <WinBase.h>


namespace System

{

	namespace Threading

	{

		#define INVALID_FUNC_POINTER "The function pointer can't be reffering to 0!"

		#define WTHREAD_INIT_FAILED "Thread creation failed. Check the error code!"

		enum _export wThreadState{None = 0x1, Running=0x2, Aborted=0x3, Stopped=0x4, Suspended = 0x5 };

		class _export wThread

		{

		private:

			wThreadState state;

			HANDLE handle;

		    LPSECURITY_ATTRIBUTES sAttr;

			SIZE_T stackSize;

			LPVOID lpParameter;

			DWORD creationFlag;

			LPDWORD threadID;

			void (*main) (void*);

			void (*mainW) ();

		public:

			wThread(void (*_main)(void*), void* args);

			wThread(void (*_mainW)());

			wThread(void (*_main)(void*), SIZE_T StackSize, void* args);

			wThread(void (*_mainW)(), SIZE_T StackSize);

			wThread(LPSECURITY_ATTRIBUTES SecAttr, void (*_main)(void*), SIZE_T StackSize, void* args);

			wThread(LPSECURITY_ATTRIBUTES SecAttr,  void (*_mainW)(), SIZE_T StackSize);

			~wThread(void);

			wThreadState CurrentState();

			HANDLE CurrentThreadHandle();

			bool Start();

			bool Abort();

		    bool Suspend();

			bool Resume();

			bool IsRunning();

		};

	}


}

Hinter _export verbirgt sich:
#define _export __declspec(dllexport)

Die dll mit der Klasse wThread compiliert ohne zu murren.

Also vermute ich das ich irgendwelche Fehler beim linken oder sonstiges gemacht habe.

Fällt euch was ins Auge?

Lg

Gateway

  • Autor
In dem Programm, das die DLL nutzen soll, muss _export als __declspec(dllimport) definiert werden. Üblicherweise macht man das in Abhängigkeit von einem weiteren Präprozessorsymbol, das im DLL-Projekt definiert wird, und ansonsten eben nicht.

In dem Header wThread.h wird der BaseDef header inkludiert. In dem header ist bereits _export definiert.

Eigentlich sollte das doch reichen? Denn der Headerinhalt wird ja zur compilezeit reinkopiert.

Oder hab ich das falsch verstanden?

Das _export Symbol ist jedenfall in der Consolen Anwendung nutzbar (wird in der Intellisense liste aufgeführt).

lg

Gateway

EDIT:

Jetzt hab ich erst geschnallt was du meinst :D.

Habs ausprobiert aber hat leider nichts genützt. Eventuell hab ich es an der falschen stelle eingefügt.

Ich werds heute abend nochmal etwas austesten.

Bearbeitet von Gateway_man

  • Autor

Sry für doppelpost.

Habs jetzt aber so eingerichtet wie du gemeint hast.

Jetzt haben sich die Fehlermeldung geringfügig geändert:

Fehler 2 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""__declspec(dllimport) public: bool __thiscall System::Threading::wThread::Start(void)" (__imp_?Start@wThread@Threading@System@@QAE_NXZ)" in Funktion "_wmain". E:\Programmierung\Cpp\LibTestConsole\LibTestConsole\LibTestConsole.obj

Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""__declspec(dllimport) public: bool __thiscall System::Threading::wThread::IsRunning(void)" (__imp_?IsRunning@wThread@Threading@System@@QAE_NXZ)" in Funktion "_wmain". E:\Programmierung\Cpp\LibTestConsole\LibTestConsole\LibTestConsole.obj

Fehler 3 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""__declspec(dllimport) public: __thiscall System::Threading::wThread::wThread(void (__cdecl*)(void))" (__imp_??0wThread@Threading@System@@QAE@P6AXXZ@Z)" in Funktion "_wmain". E:\Programmierung\Cpp\LibTestConsole\LibTestConsole\LibTestConsole.obj

Fehler 4 error LNK1120: 3 nicht aufgelöste externe Verweise. E:\Programmierung\Cpp\LibTestConsole\Debug\LibTestConsole.exe 1

Statt dllexport meckert er jetzt wegen dllimport rum.

Hm ich verstehs nicht. Die dll's greifen ja auch untereinander aufeinander zu.

Und die lassen sich alle reibungslos compilieren.

Lg

Gateway

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.