【问题标题】:Compile gtk+ & gtkmm in Vista at cmd prompt在 cmd 提示符下在 Vista 中编译 gtk+ & gtkmm
【发布时间】:2010-01-30 22:28:10
【问题描述】:

有人可以帮我在 Vista cmd 提示符下编译 gtk+ (& gtkmm) 吗? 我最近尝试过,无法让它工作。我觉得我的所有依赖项和路径都是正确的,但我显然没有或遗漏了什么!我已经搜索了互联网,但没有找到具体的帮助(我也在尝试在 cygwin 中编译,但已经成功编译并在 MSYS 中运行了简单的 helloworld gtk+ 示例)。

我通过 MinGW & Gtk+ Win32 dev (Glade) & Gtkmm Win32 安装了 gcc。以下是一些示例 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 vis C express 编译器(或任何 MSWindows7 SDK 编译器 - 因为我也安装了它?!)。我只是一个初学者/业余程序员,但确实想为 GUI 编程编写 gtk+/gtkmm 代码,并且希望能够在 cmd 提示符下编译以及使用 IDE 进行编码和编译/运行。

感谢并期待有帮助的回复,非常感谢

【问题讨论】:

    标签: c windows gtk


    【解决方案1】:

    从 cmd.exe 使用 pkg-config 真的很痛苦,因为“正常”的使用方式是在 Unix 中的反引号或反引号内(`thingies,ASCII 反引号,不要称它们为“反斜杠”)风格的外壳。如果您坚持只使用 cmd.exe,则需要做一些 cmd.exe 杂技来将 pkg-config 的输出输入到命令行中。或者只是手动运行 pkg-config 并将其输出复制/粘贴到执行构建的 .bat 文件中。

    无论如何,要记住的一件重要事情是,每当您看到不幸的常见模因运行 pkg-config 时同时使用 --cflags 和 --libs 选项(如上面 LiraNuna 的回答),一般来说无法在 Windows 上运行。

    gcc(和 cl,就此而言)的参数顺序很重要。库应该引用它们的对象(或源)文件之后。

    (它通常在 Linux 和其他基于 ELF 的系统上随机运行,因为那里的可执行文件可能包含未定义的符号。)

    因此,如果您在环境变量 FOO_CFLAGS 中有 pkg​​-config --cflags foo 的输出,并且在环境变量 FOO_LIBS 中有 pkg​​-config --libs foo 的输出,那么运行 gcc 的正确方法是

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

    其中 CFLAGS 是您想要使用的任何其他编译器标志,而 LIBS 是您需要的任何其他库。当然,可以根据需要添加更多源文件或目标文件。

    【讨论】:

      【解决方案2】:

      我强烈推荐 CMake 来完成这项任务。是的,我知道这不是你问的,但你甚至没有使用 makefile。虽然我确信可以一起破解一些命令以使其工作,但这并不实用。 CMake 内置了用于生成 makefile 和在您需要的窗口上查找 gtkmm 库的模块。它甚至可以生成 MSVC 项目或 mingw/msys makefile。
      话虽这么说,如果您坚持走硬路,请使用 --cflags 在 gtkmm.pc 文件上运行 pkg-config 并将输出复制粘贴到 .bat 文件中。我不知道将 pkg-config 嵌入到 Windows 命令行中的任何其他方式。 (实际上我曾经这样做过,它有效)
      但说真的,cmake 就是为了解决这个问题而设计的,它是 FOSS。

      【讨论】:

      • 我没有使用 makefile,因为我只是想编译一个简单的 gtk+ helloworld gui 示例——只有一个简单的文件。这给了我一场巨大的斗争(无论是在 Vista cmd 提示符下还是在 cygwin 中)!我确信有一个健全的编译命令可以做到这一点——但我不知道它是什么!我当然会考虑使用 Cmake 并尝试您的 .bat 文件替代方案(如果我不得不求助于这种事情,我将不得不使用 IDE,即 DevC 或其他)。非常感谢您的有用回复
      【解决方案3】:
      D:\RPD_Programming\RPD_HelloWorld\RPD_Gtk_helloworld>gcc helloworld.c -o hellowo
      rld pkg-config --cflags --libs gtk+-2.0
      
      1. 您需要 pkg-config 的输出作为命令的一部分,如下所示:

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

        还要确保您已正确安装和配置 pkg-config。

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

        这表明您在库路径中没有 GTK 标头

      【讨论】:

      • 我正在尝试在 Vista md 提示符下编译,并且 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 所以标题应该在路径中?这让我很困惑-无论如何感谢您的回复
      【解决方案4】:

      我从这个互联网论坛找到了一个替代解决方案: gtk forum -dreblen

      为 pkg-config --cflags & pkg-config --libs gtk+-2.0 制作这些环境变量并将它们组合成一个新的环境变量 %GTK_COMPILE% 并将其包含在 Vista cmd shell 的命令行中已经奏效并且编译完成,.exe gui 窗口 helloworld 运行。

      我仍然不知道为什么我的 pkg-version 来自 MinGW 目录和我的 pkg-config 路径是 C:\Gtk+\lib\pkgconfig。

      这仍然不是我所期望的答案,我仍然觉得应该有另一种(更好/正确)的方法来在 Vista 的 cmd 提示符下使用 gtk+ 完全使用 pkg-config 来获得成功的编译和运行。也许有一天我会正确理解这一点!

      【讨论】:

        【解决方案5】:

        我已经提交了相关的解决方案(针对Windows上的Eclipse)here

        这很费力,但很有效!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多