最近在windows环境下用vscode编辑器学写GTK4界面程序。环境为vscode + cmake + msys2。默认配置的CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.14)
project(hello-gtk)
find_package(PkgConfig REQUIRED)
pkg_check_modules(GTK4 REQUIRED gtk4)
include_directories(${GTK4_INCLUDE_DIRS})
link_directories(${GTK4_LIBRARY_DIRS})
add_executable(gtk-test src/main.c)
target_link_libraries(gtk-test ${GTK4_LIBRARIES})
对应的示例源码如下:
#include <gtk/gtk.h>
static void activate(GtkApplication* app, gpointer user_data) {
GtkWidget *window;
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "Window");
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
gtk_widget_show_all(window);
}
int main(int argc, char **argv) {
GtkApplication *app;
int status;
app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
生成Makefile后用make编译直接报错无法找到 gtk/gtk.h 头文件,偿试多次改写CMakeLists.txt均无效。最后通调试定位,发现其实是在生成头文件路径时在原有GTK路径前加上了当前CMakeLists.txt文件所在的路径所以无法编译通过。
最终解决方案如下以下为自己的测试项目:
主要是加了两个语句,对原pkg-config找的头文件路径中的分号替换成 ';/',再对开头的路径前加上‘/’号。可以用 message("THE GTK4 PATH=${GTK4_INCLUDE_DIRS}")打印出原路径值,在build目录下执行 "grep -r -I ."可以打印出cmake生成的头文件路径以确认是否正确。
string(REPLACE ";" ";/" FIXED_PATH "${GTK4_INCLUDE_DIRS}")
target_include_directories(gtk-test PRIVATE "/${FIXED_PATH}")
cmake_minimum_required(VERSION 3.14)
project(hello-gtk)
find_package(PkgConfig REQUIRED)
pkg_check_modules(GTK4 REQUIRED gtk4)
link_directories(${GTK4_LIBRARY_DIRS})
add_executable(gtk-test main.c src/mwindow.c)
#message("THE GTK4 PATH=${GTK4_INCLUDE_DIRS}")
target_include_directories(gtk-test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
#把找到的原路径中的 “;”分号替换成“;/”让cmake把pkg-config找到的路径当成绝对路径而非相对路径
#这步很重要因为不替换cmake在添加INCLUDE目录选项时会加上当前工程路径
string(REPLACE ";" ";/" FIXED_PATH "${GTK4_INCLUDE_DIRS}")
#最终的变量前也要加上“/”因为上一步并未处理到第一个路径
target_include_directories(gtk-test PRIVATE "/${FIXED_PATH}")
target_link_libraries(gtk-test ${GTK4_LIBRARIES})
经过改动后在项目的build目录下执行 cmake .. 生成Makefile后直接 make 就能成功编译。

2884

被折叠的 条评论
为什么被折叠?



