2015-10-15 43 views
1

這是在Windows 7上運行時隨Dev-C++附帶的編譯器「TDM-GCC 4.9.2 64位版本」。同樣的事情也發生在64位版本中。 「編譯器選項」中的「在調用鏈接器時添加以下標誌」設置爲-static-libgcc -lws2_32,「在調用編譯器時添加以下標誌」爲std=c++11TDM-GCC引發錯誤:對我從未調用的方法的未定義引用

不幸的是,我得不到更多的信息,因爲這是一個非常非常非常鎖定的計算機。

一旦我回家,我會在那裏測試它並編輯任何新的信息。

測試文件:

#include <windows.h> 
#include <psapi.h> 
#include <iostream> 

int main() { 
    HANDLE h = GetCurrentProcess(); 
    TCHAR name[100]; 
    GetProcessImageFileName(h, name, 100); 
    std::cout << "Name is " << std::endl; 
} 

在編譯時,它提供了以下錯誤:

C:\Users\[REDACTED]\AppData\Local\Temp\ccQz3L9P.o:test.cpp:(.text+0x2f): undefined reference to `GetProcessImageFileNameA' 

是最好的,我可以告訴大家,它調用GetProcessImageFileNameA而不是GetProcessImageFileName因爲在psapi.h#define的:

#define GetProcessImageFileName __MINGW_NAME_AW(GetProcessImageFileName) 

__MINGW_NAME_AW(func)#define d在_mingw_unicode.h作爲func##A,如果我正確理解它是新的方法名稱來自何處。

返回psapi.h,DWORD WINAPI GetProcessImageFileNameA(HANDLE, LPSTR, DWORD);已聲明,但我沒有在任何地方找到它的定義,並且Dev-C++也不能。我相當確定這是問題所在。

我該如何解決?只要我可以將我在閃存驅動器上使用的任何東西放在一起,並儘可能少地帶來煩惱,我就可以接受任何事情,包括切換編譯器或IDE,並且最終結果不需要管理員運行權限。

+0

在你用來鏈接的導入庫中發現「定義」(就像找到所有其他內核的Windows API函數一樣)在kernel32.lib中。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms683217%28v=vs.85%29.aspx。那麼這個導入庫與Dev-C++在哪裏? (順便說一句,*不是編譯器,它是一個IDE)。 – PaulMcKenzie

回答

2

GetProcessImageFileName是Windows API函數,你需要在正確的庫鏈接得到它。

根據您是在編譯「寬」還是「窄」,它被定義爲宏爲GetProcessImageFileNameAGetProcessImageFileNameW

Win32 API有每個函數的Unicode和ASCII版本(至少是帶字符串的函數)。通常,ascii版本將字符轉換爲Unicode,並在內部調用其他植入。

+0

我認爲'-lws2_32'(因爲它是GCC)會鏈接相應的庫。如果情況並非如此,我如何才能找出哪個鏈接?它是'-lpsapi'嗎? –

+0

MSDN爲每個函數引用正確的.lib和.h。谷歌搜索應該給你和任何給定的Windows API函數的正確頁面。在這種情況下,它是https://msdn.microsoft.com/en-us/library/windows/desktop/ms683217(v=vs.85).aspx – Niall

+0

我完全錯過了文檔中的該部分。非常感謝! –

1

您需要將Psapi.libKernel32.lib鏈接到您的項目中。我不確定你的編譯器,但是在VC++中,你將#pragma comment(lib, "Psapi.Lib")添加到你的代碼中,或者在項目屬性的其他庫中添加Psapi.lib

山姆

+0

「_這是在Windows 7上運行時隨Dev-C++附帶的編譯器,」TDM-GCC 4.9.2 64位版本「._」 - 問題的第一句。 :P除此之外,有沒有辦法通過GCC命令行參數來做到這一點? –

+0

@QPaysTaxes是的,只需在命令末尾添加「-lpsapi」 –