2017-06-26 33 views
0

有人告訴我幾次,那個-mwindows-mconsole命令行開關的mingw實際上隻影響EXE頭中的一個位,或者其他的不太多。但是,這似乎並不正確。如果我嘗試在我的一個項目中使用-mconsole,我得到以下錯誤的聯動:Mingw -mconsole選項導致未定義引用的MS GUI功能上的鏈接錯誤

../../build/objs/t-win32-ep128-xep128--gui.o:gui.c:(.text+0xb3): undefined reference to `[email protected]' 
../../build/objs/t-win32-ep128-xep128--gui.o:gui.c:(.text+0xc7): undefined reference to `[email protected]' 

OK,我認爲,GUI相關的選項問題不能與-mconsole使用。然而,這對我來說是一個陷阱,因爲我需要編寫一個使用GetOpenFileName()等函數的應用程序,但仍然需要控制檯,因爲我使用printf()等編寫了調試消息。此外,它似乎與「常識」意見衝突,-mconsole/-mwindows開關隻影響單個EXE頭元素,因此Windows將知道爲應用程序分配控制檯還是不分配控制檯。是的,我可以自己分配一個控制檯,但這很難看,因爲我想使用該程序啓動的控制檯。在這種情況下可以解決什麼問題?謝謝。

+2

你做錯了別的。我有一個運行良好的控制檯程序,在這裏創建一個窗口和各種控件,並運行消息循環。 –

+0

@eryksun,因爲這需要用戶做一些不尋常的事情,這很麻煩。或者,如果您需要「混合」應用程序:堅持使用「控制檯」子系統,如果啓動例如沒有命令行參數,「detach」你自己('CreateProcess()'你自己的可執行文件'DETACHED_PROCESS')。這隻有「控制檯窗口閃光燈」問題;) –

+0

實際上,如果有-mwindows選項,則連接是否正常。如果我將其更改爲-mconsole,我遇到了未定義引用的問題!我試圖包括-luser32,但沒有區別。 –

回答

2

-mwindows and -mconsole確實只設置一個標誌來確定windows應用程序的類型。如果您沒有指定任何內容,則默認爲console

也就是說,這可能是默認鏈接選項在自動鏈接的庫中有所不同。例如。對於GetOpenFileName(),您需要鏈接到comdlg32。下面的示例按預期工作:

#include <windows.h> 
#include <stdio.h> 

int main(void) 
{ 
    OPENFILENAMEA ofn = {sizeof(ofn)}; 
    char filename[1024] = {0}; 
    ofn.lpstrFile = filename; 
    ofn.nMaxFile = 1024; 

    GetOpenFileNameA(&ofn); 

    printf("selected: %s\n", filename); 

    return 0; 
} 

輸出:

$ gcc -oopendemo opendemo.c -lcomdlg32 
$ ./opendemo.exe 
selected: C:\temp\winsdksetup.exe 

檢查我的MinGW的海灣合作委員會的行爲,沒有任何圖書館和不-mwindows鏈接時,它增加了以下庫:

-lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt

-mwindows,列表看起來如下:

-lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lpthread -lgdi32 - lcomdlg32 -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt

所以,的確,gdi32comdlg32會自動與-mwindows補充說,可能是因爲他們一重新需要許多 GUI程序。

+0

嗯,那工程...我添加-lcomdlg32後。然而,即使不添加-lcomdlg32,它也適用於-mwindows。所以也許,正如你所說的那樣,它也可以暗示什麼樣的東西應該被鏈接,或者當我使用-mwindows時,它也會改變EXE頭部中的某些東西,用於指示Windows作爲控制檯/ GUI應用程序? –

+0

@LGBGáborLénárt我檢查過,看我的更新。只需用'-v'選項調用'gcc'來檢查自己 –

+0

這是一個有趣而有用的結果(對我來說至少),我認爲-mwindows/-mconsole只在EXE頭文件中設置了一些東西。但似乎還有一些其他功能。據我記得,在gcc的手冊頁中沒有提到它(okey,它不是特別的mingw,而是一般的gcc ...),它只是說它在EXE標頭中設置了一些東西......很高興知道! –

相關問題