Veröffentlicht 1. September 201212 j 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
1. September 201212 j sieht ja nach MSVC aus, schon mal die Linker Optionen geprüft, vor allem die Flags /MD bzw /MT ?
1. September 201212 j Autor Hi, sollte passen. Ist aktuell auf /MD gesetzt. Ah okay seh grad ich müsst es auf /LD stellen oder? Lg Gateway Bearbeitet 1. September 201212 j von Gateway_man
1. September 201212 j 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.
1. September 201212 j 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 . 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 1. September 201212 j von Gateway_man
1. September 201212 j 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
2. September 201212 j Autor Hast du die Importbibliothek der DLL dazugelinkt? Ja eigentlich schon: #pragma comment (lib, "Win32.System.lib")
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.