Zum Inhalt springen

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


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Geschrieben (bearbeitet)
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
Geschrieben

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

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