2013-08-25 10 views
9

Napisałem program w C, który wywołuje funkcję, GetModuleInformation(), która jest określona w psapi.hVisual Studio C++ związek z psapi.lib

używam Microsoft Visual Studio C++ kompilatora wiersza polecenia (cl.exe) do kompilowania i łączenia programu.

mam włączone pliku nagłówkowego psapi.h:

#include <psapi.h> 

gdy próbuję skompilować przy użyciu:

cl program.c 

Generuje plik obiektowy, jednak nie na etapie linkowania z błędem :

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 

ja również umieścić plik psapi.lib w tym samym folderze, w którym plik kodu źródłowego (p rogram.c) jest umieszczony, jednak nawet wtedy otrzymam taki sam komunikat o błędzie jak powyżej.

Jak skutecznie połączyć to za pomocą kompilatora wiersza poleceń (cl.exe)?

+1

Czy dodałeś plik psapi.lib do swojej listy lib? Wygląda na to, że tego nie zrobiłeś. – WhozCraig

Odpowiedz

8

Metoda 1
Jeśli chcesz skompilować z wiersza poleceń z cl.exe można użyć opcji /link, aby określić opcje linkera:

cl /TC program.c /link psapi.lib 

Metoda 2
Poniższy dyrektywy pragma powoduje linker do wyszukiwania w pliku źródłowym biblioteki psapi.lib podczas łączenia.

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

Możliwa przyczyna twoich błędów może być, jeśli psapi.lib brakuje na liście dodatkowych bibliotek łącznika.
Aby rozwiązać ten problem, należy użyć następującego /LIBPATH opcję:

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

Gdzie C: \ MyLibFolder określa ścieżkę do folderu, który zawiera psapi.lib.

Możesz także spróbować ustawić odpowiednią opcję /SUBSYSTEM.
przypadku użycia aplikacji konsoli:

/SUBSYSTEM:CONSOLE 

Rozwiązanie podobny problem here.

na przykład za pomocą funkcji 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; 
} 

Kod został przetestowany na Windows 7 i XP.
Wyjście z linkami sesji jest:

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) 
     ... 

Jeśli vsvars32.nietoperz i wszystkie odpowiednie zmienne środowiskowe w twoim Visual Studio są ustawione poprawnie, powyższe opcje linkera wytworzą poprawny plik wykonywalny (.exe).

+1

Związany z błędem [LNK2019] (http://msdn.microsoft.com/en-us/library/799kze2z%28v=vs.100%29.aspx) i [nierozstrzygnięty zewnętrzny błąd symbolu i jak mogę to naprawić] (http://stackoverflow.com/questions/12573816/what-is-an-unfined-reference-unresolved-external-symbol-error-andhow-do-i-fix) – boleto