c gtk3写demo的时候,出现一大串(.text+0xxx): undefined reference to `xxx'错误。

发布时间 2023-09-14 21:45:00作者: 星小梦

错误内容

(.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命令行中执行的。

  1. pkg-config --cflags gtk+-3.0 查看flags是否能正常查到。
  2. pkg-config --libs gtk+-3.0,同理,也是看能不能正常查到。
  3. cd到demo所在的项目根目录,执行 gcc $(pkg-config --cflags gtk+-3.0) -o *<output>* *<main>*.c $(pkg-config --libs gtk+-3.0)命令,看看能不能正常编译和链接成功(替换命令中的参数)。
  4. 如何可以正常执行,那就去排查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;
}

代码放在gitee了

其他

我是使用mingw安装的gtk3的。