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).
Czy dodałeś plik psapi.lib do swojej listy lib? Wygląda na to, że tego nie zrobiłeś. – WhozCraig