2014-03-28 20 views
5

ich lerne VC++ und Überprüfung mit Code für die Verwendung von Informationen des Speichers. Dieses Programm gibt mir drei Fehler von externen nicht aufgelösten externen ..Ungelöste externe Fehler in VC++

error LNK2019: unresolved external symbol [email protected] referenced 
in function "void __cdecl PrintMemoryInfo(unsigned long)" 
([email protected]@[email protected]) 

error LNK2019: unresolved external symbol [email protected] referenced in 
function _main 

error LNK1120: 2 unresolved externals. 

Code ::

#include "stdafx.h" 
#include <windows.h> 
#include <stdio.h> 
#include <psapi.h> 

// To ensure correct resolution of symbols, add Psapi.lib to TARGETLIBS 
// and compile with -DPSAPI_VERSION=1 

void PrintMemoryInfo(DWORD processID) 
{ 
    HANDLE hProcess; 
    PROCESS_MEMORY_COUNTERS pmc; 

    // Print the process identifier. 

    printf("\nProcess ID: %u\n", processID); 

    // Print information about the memory usage of the process. 

    hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | 
            PROCESS_VM_READ, 
            FALSE, processID); 
    if (NULL == hProcess) 
     return; 

    if (GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc))) 
    { 
     printf("\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount); 
     printf("\tPeakWorkingSetSize: 0x%08X\n", 
        pmc.PeakWorkingSetSize); 
     printf("\tWorkingSetSize: 0x%08X\n", pmc.WorkingSetSize); 
     printf("\tQuotaPeakPagedPoolUsage: 0x%08X\n", 
        pmc.QuotaPeakPagedPoolUsage); 
     printf("\tQuotaPagedPoolUsage: 0x%08X\n", 
        pmc.QuotaPagedPoolUsage); 
     printf("\tQuotaPeakNonPagedPoolUsage: 0x%08X\n", 
        pmc.QuotaPeakNonPagedPoolUsage); 
     printf("\tQuotaNonPagedPoolUsage: 0x%08X\n", 
        pmc.QuotaNonPagedPoolUsage); 
     printf("\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage); 
     printf("\tPeakPagefileUsage: 0x%08X\n", 
        pmc.PeakPagefileUsage); 
    } 

    CloseHandle(hProcess); 
} 

int main(void) 
{ 
    // Get the list of process identifiers. 

    DWORD aProcesses[1024], cbNeeded, cProcesses; 
    unsigned int i; 

    if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) 
    { 
     return 1; 
    } 

    // Calculate how many process identifiers were returned. 

    cProcesses = cbNeeded/sizeof(DWORD); 

    // Print the memory usage for each process 

    for (i = 0; i < cProcesses; i++) 
    { 
     PrintMemoryInfo(aProcesses[i]); 
    } 

    return 0; 
} 
+1

'hinzugefügt hatten richtige Auflösung zu gewährleisten der Symbole, füge Psapi.lib zu TARGETLIBS hinzu und kompiliere mit -DPSAPI_VERSION = 1 'Hast du das gemacht? – UmNyobe

Antwort

2

Versuchen Sie, diese

Zugabe
#pragma comment(lib, “psapi.lib”) 
+0

vielen Dank – user3471546

+0

@ user3471546 Kein Problem. :) – nemasu

+0

Das könnte 'kernel32.lib' sein, abhängig von der OS-Version (laut MS-Dokumentation zu [GetProcessMemoryInfo-Funktion] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683219) % 28v = vs.85% 29.aspx)). – jww

7

Die Header-Datei, die die Funktion erklärt durch die verwendet wird Compiler, um Ihren Code zu kompilieren. Der Linker benötigt jedoch eine Definition der externen Funktionen, die verwendet werden. Dies wird normalerweise in einer Importbibliothek bereitgestellt. Die Fehlermeldung teilt Ihnen mit, dass der Linker keine solche Definition hat.

Sie müssen die entsprechende Bibliothek für psapi.h Datei enthalten.

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

EDIT :: Vom MSDN-Remarks Section,

richtige Auflösung von Symbolen Um sicherzustellen, fügen Sie Psapi.lib zum TARGETLIBS Makro- und kompilieren Sie das Programm mit -DPSAPI_VERSION = 1.

Extra-::

#pragma comment ist eine Compiler-Direktive, die Visual C++ kennzeichnet einen Kommentar in der erzeugten Objektdatei zu verlassen. Der Kommentar kann dann vom Linker gelesen werden, wenn er Objektdateien verarbeitet.

#pragma comment(lib, libname) teilt den Linker mit der ‚libname‘ Bibliothek in der Liste der Bibliothek Abhängigkeiten hinzuzufügen, als ob Sie es in den Projekteigenschaften bei Linker->Input->Additional dependencies

Siehe #pragma comment auf MSDN

+0

Das könnte auch 'kernel32.lib' sein, abhängig von der OS-Version (laut MS-Dokumentation zu [GetProcessMemoryInfo-Funktion] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683219%28v = vs.85% 29.aspx)). – jww

+0

@noloader :: Danke, habe die Antwort entsprechend bearbeitet. – Abhineet

Verwandte Themen