2013-08-25 25 views
9

Ho scritto un programma C che chiama la funzione, GetModuleInformation() che è definito nella psapi.hVisual Studio C++ con psapi.lib

Sto usando Microsoft Visual Studio C++ compilatore a riga di comando (cl.exe) per la compilazione e il collegamento del programma.

Ho incluso il file di intestazione psapi.h:

#include <psapi.h> 

quando provo a compilare utilizzando:

cl program.c 

genera il file oggetto, tuttavia non riesce durante la fase di collegamento con l'errore :

program.obj : error LNK2019: unresolved external symbol [email protected] ref 
erenced in function _main 
program.exe : fatal error LNK1120: 1 unresolved externalsprogram.obj : error LNK2019: unresolved external symbol [email protected] ref 

ho anche inserire il file psapi.lib nella stessa cartella in cui il file di codice sorgente (p rogram.c) viene inserito, tuttavia anche in questo caso viene visualizzato lo stesso messaggio di errore sopra riportato.

Come si collega correttamente utilizzando il compilatore della riga di comando (cl.exe)?

+1

Hai aggiunto psapi.lib alla tua lista lib? A quanto sembra, non l'hai fatto. – WhozCraig

risposta

8

Metodo 1
Se si desidera compilare dalla riga di comando con cl.exe è possibile utilizzare l'opzione /link per specificare le opzioni di linker:

cl /TC program.c /link psapi.lib 

Metodo 2
La seguente direttiva pragma fa sì che il linker per cercare nel file sorgente per la libreria psapi.lib durante il collegamento.

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

Possibile causa per i vostri errori possono essere, se psapi.lib manca in un elenco di ulteriori librerie di linker.
Per risolvere questo, utilizzare la seguente /LIBPATH opzione:

cl /TC program.c /link Psapi.Lib /LIBPATH:C:\MyLibFolder\ 

Dove C: \ MyLibFolder specifica un percorso della cartella, che contiene il psapi.lib.

Inoltre, è possibile provare a impostare l'opzione /SUBSYSTEM corretta.
Per usare l'applicazione di console:

/SUBSYSTEM:CONSOLE 

Soluzione al problema simile here.

Esempio sull'utilizzo della funzione GetModuleInformation:

#include <windows.h> 
#include <stdio.h>  
#include <psapi.h> 
#pragma comment(lib, "psapi.lib") 

int main(void) 
{  
    MODULEINFO minfo = {0}; 
    GetModuleInformation(GetCurrentProcess(), GetModuleHandle("psapi.dll"), &minfo, sizeof(minfo)); 
    /* printf("%X", minfo.lpBaseOfDll); /* The load address of the module */ 
    return 0; 
} 

Il codice è stato testato su Windows 7 e XP.
L'uscita dal collega sessione è:

program.c 

/out:program.exe 
psapi.lib 
/LIBPATH:C:\MyLibFolder\ 
/SUBSYSTEM:CONSOLE 
/VERBOSE 
program.obj 

Starting pass 1 
Processed /DEFAULTLIB:uuid.lib 
Processed /DEFAULTLIB:LIBCMT 
Processed /DEFAULTLIB:OLDNAMES 

Searching libraries 
    Searching C:\MyLibFolder\psapi.lib: 
     Found [email protected] 
     Referenced in program.obj 
     Loaded psapi.lib(PSAPI.DLL) 
     Found __IMPORT_DESCRIPTOR_PSAPI 
     Referenced in psapi.lib(PSAPI.DLL) 
     Loaded psapi.lib(PSAPI.DLL) 
     Found __NULL_IMPORT_DESCRIPTOR 
     Referenced in psapi.lib(PSAPI.DLL) 
     Loaded psapi.lib(PSAPI.DLL) 
     ... 

Se vsvars32.bat e tutte le variabili d'ambiente appropriate in Visual Studio sono impostate correttamente le opzioni di linker sopra produrranno un file eseguibile (.exe) valido.

+1

relativo all'errore [LNK2019] (http://msdn.microsoft.com/en-us/library/799kze2z%28v=vs.100%29.aspx) e [errore di simbolo esterno non risolto e come ripararlo] (http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i-fix) – boleto

Problemi correlati