在 Code::Blocks 中使用 GTK 编译未定义对“gdk_cairo_create”的引用

Compilation with GTK in Code::Blocks undefined reference to `gdk_cairo_create'

提问人:Eric Wajnberg 提问时间:1/2/2018 最后编辑:liberforceEric Wajnberg 更新时间:1/3/2018 访问量:681

问:

在严重的系统崩溃之后,我不得不重新安装所有东西(Windows 10),包括 Code::Blocks(版本 16.01)才能使用 GTK+2 库开发我的代码。我最终遇到了一个我无法解决的奇怪情况。

我的一些程序编译正确,而另一些则编译不正确。下面是未正确编译的示例的生成日志输出的副本:

mingw32-g++.exe -L"C:\Program Files (x86)\CodeBlocks\gtk\lib" -o bin\Debug\trajecto.exe obj\Debug\main.o   -lgtk-win32-2.0 -lgobject-2.0 -lglib-2.0 "C:\Program Files (x86)\CodeBlocks\gtk\lib\cairo.lib" "C:\Program Files (x86)\CodeBlocks\gtk\lib\libpangocairo-1.0.dll.a"
obj\Debug\main.o: In function `on_expose_event_trajet':
D:/calcul C/essai gtk/essai gtk/trajecto/main.c:804: undefined reference to `gdk_cairo_create'
D:/calcul C/essai gtk/essai gtk/trajecto/main.c:805: undefined reference to `gdk_cairo_create'
D:/calcul C/essai gtk/essai gtk/trajecto/main.c:806: undefined reference to `gdk_cairo_create'
D:/calcul C/essai gtk/essai gtk/trajecto/main.c:807: undefined reference to `gdk_cairo_create'
D:/calcul C/essai gtk/essai gtk/trajecto/main.c:890: undefined reference to `gdk_cairo_create'
obj\Debug\main.o:D:/calcul C/essai gtk/essai gtk/trajecto/main.c:939: more undefined references to `gdk_cairo_create' follow
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
7 error(s), 0 warning(s) (0 minute(s), 0 second(s))

这是我得到的正确编译程序(仍然使用 gdk_cairo_create()):

mingw32-gcc.exe -Wall -mms-bitfields -g -Wall -I"C:\Program Files (x86)\CodeBlocks\gtk\include" -I"C:\Program Files (x86)\CodeBlocks\gtk\include\gtk-2.0" -I"C:\Program Files (x86)\CodeBlocks\gtk\include\cairo" -I"C:\Program Files (x86)\CodeBlocks\gtk\include\gdk" -I"C:\Program Files (x86)\CodeBlocks\gtk\include\glib-2.0" -I"C:\Program Files (x86)\CodeBlocks\gtk\lib\glib-2.0\include" -I"C:\Program Files (x86)\CodeBlocks\gtk\include\pango-1.0" -I"C:\Program Files (x86)\CodeBlocks\gtk\lib\gtk-2.0\include" -I"C:\Program Files (x86)\CodeBlocks\gtk\include\atk-1.0" -I"C:\Program Files (x86)\CodeBlocks\gtk\include\gdk-pixbuf-2.0" -c "D:\calcul C\essai gtk\essai gtk\Michal\main.c" -o obj\Debug\main.o
mingw32-g++.exe -L"C:\Program Files (x86)\CodeBlocks\gtk\lib" -o bin\Debug\ehpad.exe obj\Debug\main.o   -lgtk-win32-2.0 -lgobject-2.0 -lglib-2.0 "C:\Program Files (x86)\CodeBlocks\gtk\lib\pango-1.0.lib" "C:\Program Files (x86)\CodeBlocks\gtk\lib\gdk-win32-2.0.lib" "C:\Program Files (x86)\CodeBlocks\gtk\lib\cairo.lib" "C:\Program Files (x86)\CodeBlocks\gtk\lib\libpangocairo-1.0.dll.a"
Output file is bin\Debug\ehpad.exe with size 69.91 KB
Process terminated with status 0 (0 minute(s), 1 second(s))
0 error(s), 0 warning(s) (0 minute(s), 1 second(s))

存在差异,但我如何知道(和理解)问题出在哪里?我尝试过很多不同的东西。链接器选项中包含的库对于这两个示例(cairo.lib 和 libpangocairo-1.0.dll.a)是相同的。

我在网络上的不同地方发现编译行上参数的顺序可能很重要,但我在 Code::Blocks 中看不到如何更改这一点。

这让我发疯了,如果有人能给我一个提示,我将不胜感激。

提前感谢和欢呼,埃里克。

Windows GTK 代码块 未定义引用 GTK2

评论


答:

0赞 liberforce 1/2/2018 #1

日志告诉您遇到的错误是链接错误,因此很明显您需要检查链接参数之间的差异。

我首先将您给出的链接命令复制/粘贴到 2 个不同的文件中。然后使用一个 diff 工具,可以分辨出一行内有什么不同:meld。结果是缺少一些库,这些库在非工作设置中未提供给链接器。

"C:\Program Files (x86)\CodeBlocks\gtk\lib\pango-1.0.lib"
"C:\Program Files (x86)\CodeBlocks\gtk\lib\gdk-win32-2.0.lib"

gdk_cairo_create属于 。由于您使用的是 win32 后端,因此它存在于其中,因此链接器会正确地抱怨,因为您没有与它链接。gdkgdk-win32-2.0.lib

但是,所有这些参数通常都应通过在链接器选项中调用 pkg-config 来整理。这样可以避免忘记依赖关系。

评论

0赞 Eric Wajnberg 1/4/2018
谢谢,这确实是问题所在。我已将这两个库添加到链接器中,它现在可以工作了。谢谢!令我惊讶的是,我已经看到这两个库丢失了,而且我之前已经尝试过了,但它不起作用。我一定犯了一些错误。另一件令我惊讶的事情是,事实上,这两个库应该已经存在了。无论如何,非常感谢您帮助我解决这个问题,这让我发疯了几个星期。干杯,埃里克。