2010-01-30 62 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

这是艰苦的,但它的作品!