Linker Error LNK2001



  • .....



  • ReZZeX schrieb:

    So ich habe jetzt herausgefunden

    Das war dir doch eigentlich von Anfang an klar.

    Dann ersetzt mal BYTE durch char und probier aus, ob der Fehler dann auch auftritt. Wenn nein, liegt es an BYTE, was immer das auch ist.



  • ............



  • Nun, dann handelt es sich wohl um BYTE aus Windows, d.h. statt char müsste unsigned char funktionieren. Das wird dann aber wohl auch nicht helfen, da du das Projekt irgendwie kaputtkonfiguriert hast.

    Vielleicht solltest du deine Dateien in ein neu mit VS angelegtes Projekt kopieren und dann nicht an Schaltern herumspielen, die du nicht genau kennst.



  • ........



  • .............



  • Na, wenn du statisch linkst landet der komplette Code, der vorher in der externen DLL war in deiner exe, deshalb ist die größer, der Nutzer braucht die DLL aber nicht.
    Deshalb nimmt man ja DLLs.



  • ........



  • 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