Linker Error LNK2001



  • ReZZeX schrieb:

    Also dann würde ich lieber wieder meine alte Variante /NODEFAULTLIBARY nehmen.

    Dann musst du die komplette C++ Runtime schreiben, von Speicherverwaltung über Exception Handling bis hin zum Initialisierungscode, der dir globale Variablen initialisiert. Höchstwahrscheinlich brauchst du auch noch Teile der C Standardbibliothek, die musst du dann auch schreiben. Genauso wie die C++ Standardbibliothek. Das ist für dich schlicht und ergreifend nicht möglich.

    Also musst du die entweder statisch oder dynamisch linken. Dynamisch willste nicht, also bleibt nur statisch. Die Größe der .exe kannst du vielleicht verkleinern, indem du Debuggingsymbole raushaust, weiß nicht genau wie MSVC das macht.



  • Was sind genau die "Debuggingsymbole"? Und ich habe halt wie gesagt schon alles verlinkt und bekomme nur noch diese beiden Linker Error die über Memory Allocation (?) gehen.



  • Hallo,

    angemeckert werden die []-Operatoren, also

    void * __cdecl operator new[](unsigned int bytes)
    {
      return HeapAlloc(GetProcessHeap(), 0, bytes);
    }
    
    void __cdecl operator delete[](void *ptr)
    {
      if(ptr) HeapFree(GetProcessHeap(), 0, ptr);
    }
    


  • .....



  • Habe es leider immer noch nicht loesen koennen.



  • ReZZeX schrieb:

    Habe es leider immer noch nicht loesen koennen.

    Viel Spass dabei die halbe Runtime zu implementieren. 🙄

    Welcher Codeteil führt denn zu diesem Fehler? Diesen umschreiben, die fehlende Funktion implementieren - oder einfach die Runtime statisch mitnehmen.


  • Mod

    DarkShadow44 schrieb:

    Welcher Codeteil führt denn zu diesem Fehler? Diesen umschreiben, die fehlende Funktion implementieren - oder einfach die Runtime statisch mitnehmen.

    terminate ist allgemeiner Teil der Exceptionbehandlung.



  • SeppJ schrieb:

    terminate ist allgemeiner Teil der Exceptionbehandlung.

    So etwas in der Art hatte ich vermutet. Solange man allerdings nur mit der WinApi arbeitet und auf die Standardbibliothek verzichtet sollten nirgends Exceptions fliegen.



  • Das ist der komplette Code Teil:

    DWORD Class::GetNamedProcessID(LPCTSTR process_name)
    {
    	DWORD* pProcs = NULL;
    	DWORD retVal = 0;
    	DWORD dwSize = 1024;
    	DWORD dwRealSize = 0;
    	TCHAR szCompareName[MAX_PATH + 1];
    	int nCount = 0;
    	int nResult = 0;
    
    	pProcs = new DWORD[dwSize]; <-- NEW
    	EnumProcesses(pProcs, dwSize*sizeof(DWORD), &dwRealSize);
    	dwSize = dwRealSize / sizeof(DWORD);
    
    	for (DWORD nCount = 0; nCount < dwSize; nCount++)
    	{
    		ZeroMemory(szCompareName, MAX_PATH + 1 * (sizeof(TCHAR)));
    		if (GetProcessName(szCompareName, MAX_PATH, pProcs[nCount]))
    		{
    			if (lstrcmp(process_name, szCompareName) == 0)
    			{
    				retVal = pProcs[nCount];
    				delete[] pProcs; <-- DELETE
    				return retVal;
    			}
    		}
    	}
    	delete[] pProcs;
    	return 0;
    }
    
    void * __cdecl operator new[](unsigned int bytes) NEW
    {
    	return HeapAlloc(GetProcessHeap(), 0, bytes);
    }
    
    void __cdecl operator delete[](void *ptr) DELETE
    {
    	if (ptr) HeapFree(GetProcessHeap(), 0, ptr);
    }
    


  • Das ist kaum der ganze Code, da fehlt der Teil der zum Linkerfehler führt.

    Wie auch immer, implementier die Funktion einfach mit

    namespace std
    {
    	void terminate()
    	{
    		ExitProcess(0);
    	}
    }
    

    dann sollte der Linker still sein.
    Oder versuch Exceptions komplett zu deaktivieren.



  • .........



  • Projekteigenschaften -> C/C++ -> Codegenerierung -> C++-Ausnahmen aktivieren
    


  • .........


Anmelden zum Antworten