gtk4编程用cmake生成Makefile编译时无法找到gtk/gtk.h解决方案

最近在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 就能成功编译。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值