2010-01-30 43 views
1

有人可以幫助我在Vista cmd提示符下編譯gtk +(& gtkmm)嗎? 我最近試過&無法得到這個工作。我覺得我有所有的依賴和路徑正確,但我顯然沒有或缺少一些東西!我搜索了互聯網,但沒有找到具體的幫助(我也試圖在cygwin中編譯 - 但已成功編譯&在MSYS中運行簡單的helloworld gtk +示例)。在Vista中編譯gtk +&gtkmm在cmd提示符

我已通過MinGW安裝gcc & Gtk + Win32 dev(Glade)&已安裝Gtkmm Win32。以下是一些示例cmd提示輸出,以顯示我遇到的問題:

D:\RPD_Programming\RPD_HelloWorld\RPD_Gtk_helloworld>gcc helloworld.c -o hellowo 
rld 
helloworld.c:1:21: gtk/gtk.h: No such file or directory 
helloworld.c:5: error: syntax error before '*' token 
helloworld.c:11: error: syntax error before "delete_event" 
helloworld.c:11: error: syntax error before '*' token 
helloworld.c: In function `delete_event': 
helloworld.c:26: error: `TRUE' undeclared (first use in this function) 
helloworld.c:26: error: (Each undeclared identifier is reported only once 
helloworld.c:26: error: for each function it appears in.) 
helloworld.c: At top level: 
helloworld.c:30: error: syntax error before '*' token 
helloworld.c: In function `main': 
helloworld.c:40: error: `GtkWidget' undeclared (first use in this function) 
helloworld.c:40: error: `window' undeclared (first use in this function) 
helloworld.c:41: error: `button' undeclared (first use in this function) 
helloworld.c:48: error: `GTK_WINDOW_TOPLEVEL' undeclared (first use in this func 
tion) 
helloworld.c:56: error: `NULL' undeclared (first use in this function) 
helloworld.c:80: error: `gtk_widget_destroy' undeclared (first use in this funct 
ion) 

D:\RPD_Programming\RPD_HelloWorld\RPD_Gtk_helloworld>gcc helloworld.c -o hellowo 
rld pkg-config --cflags --libs gtk+-2.0 
gcc: pkg-config: No such file or directory 
gcc: gtk+-2.0: No such file or directory 
cc1.exe: error: unrecognized command line option "-fcflags" 
cc1.exe: error: unrecognized command line option "-flibs" 

D:\RPD_Programming\RPD_HelloWorld\RPD_Gtk_helloworld>gcc --v 
Reading specs from C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/specs 
Configured with: ../gcc-3.4.5-20060117-3/configure --with-gcc --with-gnu-ld --wi 
th-gnu-as --host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --dis 
able-nls --enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry --d 
isable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --with 
out-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enabl 
e-hash-synchronization --enable-libstdcxx-debug 
Thread model: win32 
gcc version 3.4.5 (mingw-vista special r3) 

D:\RPD_Programming\RPD_HelloWorld\RPD_Gtk_helloworld>pkg-config --version 
0.23 

D:\RPD_Programming\RPD_HelloWorld\RPD_Gtk_helloworld>which pkg-config 
/cygdrive/c/Gtk+/bin/pkg-config 

D:\RPD_Programming\RPD_HelloWorld\RPD_Gtk_helloworld> echo %PKG_CONFIG_PATH% 
C:\Gtk+\lib\pkgconfig 

是否已安裝pkg-config?我是否使用正確的編譯命令語法? 我可以使用MS與C Express編譯器(或者其他MSWindows7 SDK編譯器 - 因爲我也安裝了?!)。我只是一個初學者/業餘編程人員,但是想爲GUI編程編寫gtk +/gtkmm代碼,希望能夠在cmd提示符下編譯以及使用IDE編譯&編譯/運行。

我很感謝並期待有幫助的回覆,非常感謝

回答

0

從cmd.exe使用pkg-config實際上是一種痛苦,因爲使用它的「正常」方法是在反引號或反引號內(反義詞,ASCII反引號,不要稱它們爲「反斜槓」) Unix風格的外殼。如果您堅持只使用cmd.exe,則需要執行一些cmd.exe雜技以獲取pkg-config的輸出到命令行中。或者只是手動運行pkg-config並將其輸出複製/粘貼到構建的.bat文件中。

無論如何,要記住的一件重要事情是,無論何時您看到不幸的常見模式,同時運行pkg-config和--cflags和--libs選項(如上面的LiraNuna的答案),在一般不會在Windows上工作。

爲gcc(和cl,就此而言)給出的參數的順序重要的。在引用它們的對象(或源)文件之後,庫應該去

(這恰好通常在Linux和其它基於ELF的系統工作,以隨機做,因爲可執行文件有可能包含未定義的符號。)

所以,如果你有pkg配置的輸出--cflags FOO在的環境變量FOO_CFLAGS和pkg配置的輸出--libs FOO中的環境變量FOO_LIBS,運行GCC的正確的方法是

gcc %CFLAGS% -o myprog.exe %FOO_CFLAGS% myprog.c %FOO_LIBS% %LIBS% 

其中CFLAGS是要使用任何其他編譯器標誌和LIBS你需要的任何其他庫。當然,根據需要添加更多的源文件或目標文件。

0

我會強烈建議CMake的完成這個任務。是的,我知道這不是你問的,但你甚至沒有使用makefile。雖然我確信有可能將一些命令集中在一起,這會使其工作起來,但這並不實際。 CMake內置了用於生成makefile並在您需要的窗口上查找gtkmm庫的模塊。它甚至可以生成MSVC項目或mingw/msys makefile。
這就是說,如果你堅持走艱苦的路,請使用--cflags在gtkmm.pc文件上運行pkg-config,然後將輸出複製粘貼到.bat文件中。我不知道任何其他方式將pkg-config嵌入到Windows命令行中。 (我真的這樣做了一次,它的工作)
但嚴重的是,cmake的目的是解決這個問題,它是自由和開放源碼軟件。

+0

我沒有使用makefile,因爲我只是想編譯一個簡單的gtk + helloworld gui example-only一個簡單的文件。這給了我一場巨大的掙扎(在Vista cmd提示符和cygwin中)!我確定有一個合理的編譯命令來做到這一點 - 但我不知道它是什麼! 我一定會考慮使用Cmake並嘗試你的.bat文件替代方案(如果我必須訴諸這種事情,我將不得不使用IDE即DevC或其他)。非常感謝您的有用答覆 – rpd 2010-01-31 17:45:45

0
D:\RPD_Programming\RPD_HelloWorld\RPD_Gtk_helloworld>gcc helloworld.c -o hellowo 
rld pkg-config --cflags --libs gtk+-2.0 
  1. 您需要pkg配置的輸出作爲像這樣的命令的一部分:

    gcc helloworld.c -o helloworld.exe `pkg-config --cflags --libs gtk+-2.0` 
    

    另外,還要確保你有pkg配置正確安裝和配置。

  2. helloworld.c:1:21: gtk/gtk.h: No such file or directory

    這說明你沒有GTK頭庫路徑

+0

我想在Vista中編譯提示符&反斜槓不被Windows識別(據我所知 - 即使我在路徑中有CoreUtils&GnuWin32,我不認爲這會起作用)。我在配置pkg-config時遇到問題。當我用cmd提示符檢查這個版本時,我得到了MinGW \ lib \ pkgconfig,但是我的echo%PKG_CONFIG_PATH%給出了C:\ Gtk + \ lib \ pkgconfig?在我的LIB&INCLUDE路徑中,我再次擁有C:\ Gtk + \ include&C:\ Gtk + \ include \ gtk-2.0 \ gtk,所以標題應該在路徑中?這讓我感到困惑 - 無論如何感謝您的回覆 – rpd 2010-01-31 17:32:37

0

我發現從這個網上論壇的替代解決方案: gtk forum -dreblen

使這些ENV pkg-config的變量--cflags & pkg-config --libs gtk + -2.0並將它們組合到一個新的env var%GTK_COMPILE%中,並將它包含在Vi的命令行中sta cmd shell已經工作並且編譯完成並且.exe​​ GUI窗口helloworld運行。

我仍然不知道爲什麼我的pkg版本來自MinGW目錄,我的pkg-config 路徑是C:\ Gtk + \ lib \ pkgconfig。

這仍然不是我所期望的答案,我仍然認爲應該有另一種(更好/正確)的方式在Vista中使用gtk +在cmd提示符下完全使用pkg-config以獲得成功的編譯和運行。也許有一天我會正確理解這一點!

0

我已經提交了相關的解決方案(在Eclipse中在Windows針對性)here

這是艱苦的,但它的作品!