【问题标题】:Why won't g++ compile a simple GTK program?为什么 g++ 不能编译一个简单的 GTK 程序?
【发布时间】:2013-12-31 21:57:05
【问题描述】:

这几天我开始自学一点 C++,同时我决定学习一些 GUI 编程。问题是,无论是使用 GTK(Windows 捆绑包 3.6.4)还是 wxWidgets(3.0.0),它都无法编译。我得到的错误是相似的,所以我坚持使用 GTK+ 来回答这个问题。

5 天后(7 次重新编译 wx、许多教程、SO 问题和谷歌),这就是我尝试编译 code 的方式(我在 Windows 7、64 位下,这不是一个选项立即切换到 Linux):

@echo off

set cygpath=C:\Cygwin\bin
set filename=simple

%cygpath%\bash.exe -c "gcc $(pkg-config --cflags gtk+-3.0) -o %filename% %filename%.c $(pkg-config --libs gtk+-3.0)"

echo.
pause

但我得到的唯一输出是这个(backtilts 而不是$() 返回相同的东西):

: Invalid argument
: Invalid argument

我一开始在没有 Cygwin 的情况下也尝试过,但结果是:

gcc: error: $(pkg-config: No such file or directory
gcc: error: gtk+-3.0): No such file or directory
gcc: error: $(pkg-config: No such file or directory
gcc: error: gtk+-3.0): No such file or directory
gcc: error: unrecognized command line option '--cflags'
gcc: error: unrecognized command line option '--libs'

使用引号或双引号根本没有帮助。我在 cygwin-bash 或 Windwos 提示符下都尝试了所有这些

我对 C++、wxWidgets 和 GTK+ 完全陌生,我已经看过 this,但由于它没有解决我的问题,而且由于声誉问题我无法发表评论,我想我必须提出一个新问题.

另外,我将编译器更改为TDM-GCC,因为我无法使用 MinGW 编译 wx。这有点相关吗?我在这里错过了什么?

提前感谢您的帮助。

编辑:抱歉,刚刚意识到示例是用 C 编写的,而不是 C++。我现在添加标签。 (但是,错误与我用于 wx 的 C++ 代码相同,因此我保留了 C++ 标记。)

【问题讨论】:

  • cmd.exe 似乎没有在字符串中进行内联变量替换。 (Windows 大师请确认或反驳。)
  • @H2CO2:是的,它确实替换了字符串中的变量。除了cmd 中的变量拼写为%LIKE_THIS% 而不是$(LIKE_THIS)
  • @BillyONeal 3,而不是 2(我会想念我的双重负电荷)。这看起来很合乎逻辑,但%it --work with /commands/too% 呢?
  • @H2CO3:不,那样没有命令支持。
  • @BillyONEal 呃...为什么每个人都不能只使用 Bash...!? (修辞)

标签: c++ c g++ wxwidgets gtk3


【解决方案1】:

这不是 gcc 问题。这是脚本/shell/bash/环境问题。

gcc: error: $(pkg-config: No such file or directory

这一行表示'gcc'看到了$(pkg-config,它期望一个文件名; Linux 应用程序期望调用它们的 shell 已为它们完成命令行替换。

这意味着shell没有消耗$(pkg-config --cflags gtk+-3.0)并对其执行替换。

您可能想尝试制作一个 bash 脚本 gtkcc.sh,它会为您执行此操作并将相关参数插入到适当的位置。

#!/bin/bash

# usage: gtkcc.sh <filename>
filename="$1"; shift
if [ -z "${filename}" ]; then echo "Usage: $0 <filename>"; exit 255; fi
if [ ! -f "${filename}.c" ]; then echo "Cannot find ${filename}.c"; exit 255; fi

gtkCFLAGS="$(pkg-config --cflags gtk+-3.0)"
gtkLDFLAGS="$(pkg-config --libs gtk+-3.0)"

cmd="gcc ${gtkCFLAGS} -o \"${filename}\" \"${filename}.c\" ${gtkLDFLAGS}"
echo $cmd >${TMP}/gtkcc.log
eval $cmd

另存为 gtkcc.sh 或 gtkcc,chmod a+rx gtkcc.sh

更改要调用的 bat 文件:

%cygpath%\bash.exe gtkcc.sh %filename%

如果不起作用,请启动 bash 并查阅 ${TMP}/gtkcc.log,否则可以将 echo 行注释掉。

【讨论】:

  • 您所指的错误仅在我从 Windows 终端调用 gcc 时显示。使用 Cygwin 的 bash,错误为 : Invalid argument。我也尝试了你的建议,但没有奏效,现在给出:: No such file or directoryash gtkcc.sh: line 2: $'\r': command not found gtkcc.sh: line 4: $'shift\r': command not found gtkcc.sh: line 14: syntax error: unexpected end of file
  • 这意味着您在 .sh 文件中有 Windows 行结尾,并且 bash 正在对字符进行吐槽。您需要转换为以dos2unix gtkcc.sh 结尾的Unix 文件。 stackoverflow.com/questions/11616835/… 另一个选择是养成使用 Notepad++ 之类的习惯(它可以让你指定行结束模式)而不是记事本。
  • 我实际上使用 Emacs 或 Notepad++ 进行编码(尽管我只使用 NP++ 进行快速编辑),但无论如何...我将 EOL 更改为 Unix,现在它停止了长错误。不过,另一个还在那里。 : Invalid Argument,我的意思是。
  • 什么 - 如果有的话 - 它正在写入 /tmp/gtkcc.log 吗?
  • 仅限: Invalid Argument。但是,如果我用pkg-config --cflags --libs gtk+-3.0 的内容设置变量,Windows 就会停止抱怨并开始工作。所以我现在坚持这个。感谢您的宝贵时间,对任何事情感到抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
相关资源
最近更新 更多