错误内容
(.text+0x4b): undefined reference to `gtk_window_get_type'
环境
开发工具:IDEA
GTK: mingw-w64-x86_64-gtk3
解决方法
前提是你已经按照GTK按照教程进行按照过GTK了
第一种
排查cmake的变量是否拼写错误,我出现的这个原因是这里拼出了GTK3_LIBRARYIES导致的错误,应该是GTK3_LIBRARIES。
可以通过MESSAGE函数输出变量的值,可以判断是否是变量名写错名了(demo处有用法)。
第二种就是通过排查的方式了
命令都是在msys2软件的mingw64.exe命令行中执行的。
pkg-config --cflags gtk+-3.0
查看flags是否能正常查到。pkg-config --libs gtk+-3.0
,同理,也是看能不能正常查到。- cd到demo所在的项目根目录,执行
gcc $(pkg-config --cflags gtk+-3.0) -o *<output>* *<main>*.c $(pkg-config --libs gtk+-3.0)
命令,看看能不能正常编译和链接成功(替换命令中的参数)。 - 如何可以正常执行,那就去排查cmake的配置文件的内容吧。
demo代码
CMakeLists.txt
cmake_minimum_required(VERSION 3.25)
project(ExampleCComputeUI C)
set(CMAKE_C_STANDARD 11)
find_package(PkgConfig REQUIRED)
PKG_CHECK_MODULES(GTK3 REQUIRED gtk+-3.0)
include_directories(${GTK3_INCLUDE_DIRS})
link_directories(${GTK3_LIBRARY_DIRS})
MESSAGE(STATUS "GTK3_INCLUDE_DIRS = ${GTK3_INCLUDE_DIRS}")
MESSAGE(STATUS "GTK3_LIBRARY_DIRS = ${GTK3_LIBRARY_DIRS}")
MESSAGE(STATUS "GTK3_CFLAGS_OTHER = ${GTK3_CFLAGS_OTHER}")
add_definitions(${GTK3_CFLAGS_OTHER})
add_executable(ExampleCComputeUI main.c)
target_link_libraries(ExampleCComputeUI ${GTK3_LIBRARIES})
MESSAGE(STATUS "GTK3_LIBRARIES = ${GTK3_LIBRARIES}")
main.c
#include <stdio.h>
#include <gtk/gtk.h>
static void print_hello(GtkWidget *widget, gpointer data){
g_print("Hello World\n");
}
static void activate(GtkApplication *app, gpointer user_data){
GtkWidget *window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "Hello World");
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
GtkButtonBox *button_box = (GtkButtonBox *) gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
gtk_container_add(GTK_CONTAINER(window), (GtkWidget *) button_box);
GtkButton *button = (GtkButton *) gtk_button_new_with_label("Hello World");
gtk_container_add(GTK_CONTAINER(button_box), (GtkWidget *) button);
g_signal_connect(button,"clicked", G_CALLBACK(print_hello), NULL);
// 关闭
g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_window_close), window);
// 显示
gtk_widget_show_all(window);
}
int main(int argc, char **argv) {
GtkApplication *app = gtk_application_new("test.app", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
int status = g_application_run((GApplication *) app, argc, argv);
g_object_unref(app);
return status;
}
其他
我是使用mingw安装的gtk3的。
- reference xxx undefined 错误 时候reference xxx undefined错误 undefined_reference_to_xxx undefined_reference_to_xxx undefined reference undefined reference cmake xxx undefined reference mkcramfs cramfs preloader undefined reference ubuntu undefined reference int add imp_wsacleanup wsacleanup undefined reference undefined reference winmain 39 event_handler undefined reference typeinfo