GTKMM编译求助:Hello World示例链接失败(MSYS2环境)
解决MSYS2编译GTKMM Hello World的链接错误
问题详情
尝试在MSYS2环境编译GTKMM 4.x的Hello World示例,使用了两种编译命令:
命令1(手动指定头文件和库)
-DLIBDEFLATE_DLL -IC:/msys64/mingw64/include/gtkmm-4.0 -IC:/msys64/mingw64/lib/gtkmm-4.0/include -IC:/msys64/mingw64/include/gtk-4.0 \ -IC:/msys64/mingw64/include/cairo -IC:/msys64/mingw64/include/graphene-1.0 \ -IC:/msys64/mingw64/lib/graphene-1.0/include -IC:/msys64/mingw64/include/pangomm-2.48 \ -IC:/msys64/mingw64/lib/pangomm-2.48/include -IC:/msys64/mingw64/include/giomm-2.68 \ -IC:/msys64/mingw64/lib/giomm-2.68/include -IC:/msys64/mingw64/include/glibmm-2.68 \ -IC:/msys64/mingw64/lib/glibmm-2.68/include -IC:/msys64/mingw64/include/cairomm-1.16 \ -IC:/msys64/mingw64/lib/cairomm-1.16/include -IC:/msys64/mingw64/include/sigc++-3.0 \ -IC:/msys64/mingw64/lib/sigc++-3.0/include -IC:/msys64/mingw64/include/pango-1.0 \ -IC:/msys64/mingw64/include/harfbuzz -IC:/msys64/mingw64/include/pango-1.0 \ -IC:/msys64/mingw64/include/fribidi -IC:/msys64/mingw64/include/cairo \ -IC:/msys64/mingw64/include/freetype2 -IC:/msys64/mingw64/include/harfbuzz \ -IC:/msys64/mingw64/include/pixman-1 -IC:/msys64/mingw64/include/gdk-pixbuf-2.0 \ -IC:/msys64/mingw64/include/libpng16 -IC:/msys64/mingw64/include/webp \ -IC:/msys64/mingw64/include/glib-2.0 -IC:/msys64/mingw64/lib/glib-2.0/include \ -lgtkmm-4.0 -lgtk-4.0 -lpangowin32-1.0 -lcairo-gobject -lgraphene-1.0 -lpangomm-2.48 \ -lgiomm-2.68 -lgio-2.0 -lglibmm-2.68 -lcairomm-1.16 -lsigc-3.0 -lpangocairo-1.0 -lpango-1.0 \ -lharfbuzz -lcairo -lgdk_pixbuf-2.0 -lgobject-2.0 -lglib-2.0 -lintl
命令2(使用pkg-config)
g++ -static -static-libgcc `pkg-config gtkmm-4 --cflags --libs`
执行后均出现以下链接错误:
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lgtk-4: No such file or directory C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lgraphene-1.0: No such file or directory collect2.exe: error: ld returned 1 exit status
已添加C:\msys64\mingw64\bin到系统路径,且确认gtk-4和graphene的头文件、库文件均存在于对应目录,示例代码如下:
#include <gtkmm.h> class Win : public Gtk::Window { public: Win(); }; Win::Win() { set_title("Hello world"); set_default_size(500,500); } int main (int argc, char * argv[]) { auto app = Gtk::Application::create("org.gtkmm.examples.base"); return app->make_window_and_run<Win>(argc, argv); }
解决步骤
修正pkg-config包名:MSYS2中GTKMM 4.x的正确pkg-config包名是
gtkmm-4.0,而非gtkmm-4。修改后的编译命令需包含源文件名:g++ -static -static-libgcc `pkg-config gtkmm-4.0 --cflags --libs` main.cpp -o hello.exe替换
main.cpp为你的实际源文件名。安装静态库依赖:由于使用了
-static参数,需确保安装了GTK4、graphene及GTKMM的静态库版本,在MinGW64终端执行:pacman -S mingw-w64-x86_64-gtk4-static mingw-w64-x86_64-graphene-static mingw-w64-x86_64-gtkmm4手动指定库路径:若pkg-config仍无法定位库文件,可在编译命令中添加库目录参数:
g++ -static -static-libgcc -LC:/msys64/mingw64/lib `pkg-config gtkmm-4.0 --cflags --libs` main.cpp -o hello.exe确认终端环境:必须使用MinGW64终端启动编译,MSYS2终端的环境变量配置与MinGW64不兼容,会导致pkg-config无法正确识别库路径。
内容的提问来源于stack exchange,提问作者loaded_dypper
相关产品推荐
相关产品推荐

