Gtk4函数gtk_builder_new_from_string返回类型引发编译错误的问题求助
我最近在使用Gtk4的gtk_builder_new_from_string函数时遇到了一个头疼的问题——它返回的类型和我预期的不一致,直接导致编译失败,想请各位帮忙分析下原因。
先给大家看看我的C++代码片段:
#include <iostream> #include <string> #include <typeinfo> #include <gtk/gtk.h> #include <FileUtils.hpp> using namespace std; // 省略部分代码 int main(void) { string xmlString; GtkBuilder * builder_p = NULL; readWholeFileIntoString("c:\\users\\craig\\Documents\\simple.ui", &xmlString); builder_p = gtk_builder_new_from_string(xmlString.c_str(), xmlString.length()); cout << "Type of builder_p = " << typeid(builder_p).name() << endl; if (GTK_IS_BUILDER(builder_p)) { // 下面这行代码在编译时出问题!注释掉它的话代码就能正常编译运行 builder_p->get_objects(); } return 0; }
这段代码放在InvokeBuilder.cpp文件里,用Visual Studio 2022自带的C++编译器搭配nmake编译时,弹出了如下错误:
InvokeBuilder.cpp
InvokeBuilder.cpp(89): error C2027: use of undefined type '_GtkBuilder'
c:\msys64\mingw64\include\gtk-4.0\gtk/gtktypes.h(39): note: see declaration of '_GtkBuilder'
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\bin\HostX64\x64\cl.exe"' : return code '0x2'
Stop.
我顺着提示去看了gtktypes.h的第39行,发现只有这么一行:
typedef struct _GtkBuilder GtkBuilder;
也就是说_GtkBuilder只是一个前向声明,并没有给出结构体的具体定义。另外我也查了gtk_builder_new_from_string的函数声明,不管是官方文档还是gtkbuilder.h头文件里,它的返回值确实是GtkBuilder*类型。
奇怪的是,如果我把builder_p->get_objects();这行注释掉,代码就能正常编译运行,运行时输出的内容是:
Type of builder_p = struct _GtkBuilder * __ptr64
这说明函数确实返回了一个64位的_GtkBuilder指针,但我就是没法直接访问它的成员函数。我试过用类型转换之类的方法,但都没效果。
现在我有几个疑问想请教大家:
- 是不是我对Gtk的使用有什么误解,漏掉了关键的步骤?
- 要不要自己编译最新版的Gtk4来解决这个问题?
- 会不会是Visual Studio编译器的兼容性问题?用GCC编译会不会就没这个问题?
- 这类问题是不是更适合去Gtk的官方邮件列表提问?
另外提前说明:我不想换成gtk_builder_new_from_file函数,希望能解决当前使用gtk_builder_new_from_string遇到的问题。
备注:内容来源于stack exchange,提问作者Craig Sanders

