在 Cmake 中包含 pkg-config --cflags --libs gtk+-2.0

Posted

技术标签:

【中文标题】在 Cmake 中包含 pkg-config --cflags --libs gtk+-2.0【英文标题】:Include pkg-config --cflags --libs gtk+-2.0 in Cmake 【发布时间】:2022-01-13 06:52:39 【问题描述】:

我正在 debian11 上使用 cmake 构建 c 代码。因为我不太了解cmake。 当我构建代码时我出错了

 fatal error: gio/gio.h: No such file or directory
   17 | #include <gio/gio.h>
      |          ^~~~~~~~~~~
compilation terminated.

我安装了 glib 库并检查了系统中存在的内容

oot@rpi4-20210823:~/iot-hub-device-update# ls /usr/include/g
gconv.h             gdk-pixbuf-2.0/     gio-unix-2.0/       glob.h              gnumake.h           grp.h               gsl/                gtk-2.0/
gdb/                getopt.h            glib-2.0/           gnu-versions.h      graphite2/          gshadow.h           gtest/              gtk-unix-print-2.0/
root@rpi4-20210823:~/iot-hub-device-update# ls /usr/include/glib-2.0/

所以在网上搜索后发现需要使用以下参数pkg-config --cflags --libs gtk+-2.0 构建。 输出是

This is output for ```root@rpi4-20210823:~/iot-hub-device-update# pkg-config --cflags --libs gtk+-2.0
-pthread -I/usr/include/gtk-2.0 -I/usr/lib/aarch64-linux-gnu/gtk-2.0/include -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/aarch64-linux-gnu/glib-2.0/include -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16 -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lharfbuzz -lfontconfig -lfreetype```

但我没有找到将这个包含在 cmake 中的方法。

Aslo 通过在 cmaketest 文件中添加以下部分尝试了其他选项

pkg_check_modules(GTK "gtk+-2.0")
include_directories($target_name PUBLIC  $GTK_INCLUDE_DIRS)
target_link_libraries($target_name PUBLIC $GTK_LIBRARIES)
target_compile_options($target_name PUBLIC $GTK_CFLAGS_OTHER)

但是没用过请帮忙解决问题

谢谢

【问题讨论】:

如果你在终端运行pkg-config --cflags --libs gtk+-2.0,它会输出什么? ls /usr/include/glib-2.0/ 的输出是什么(因为忘记粘贴了)? 既然你传递了一个目标名称,你可能想要target_include_directories 而不是include_directories 另外,在您的CMakeLists.txt 文件中,尝试message("GTK_INCLUDE_DIRS = '$GTK_INCLUDE_DIRS'") 以查看其设置是否正确(并且与pkg-config 命令的输出相匹配)。 顺便,请edit您的问题包含相关信息。 如果您使用ls /usr/include/glib-2.0/,是否列出了gio 目录?里面有一个gio.h 文件?如果你这样做,输出是什么? find /usr/include -name gio.h?头文件是否在预期的位置找到?还是根本没有? 【参考方案1】:

始终使用可用的导入目标。 CMake 的 PkgConfig 支持创建导入的目标。因此,您应该使用它们。这是一个简单的例子:

cmake_minimum_required(VERSION 3.21)
project(example)

find_package(PkgConfig REQUIRED)
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET "gtk+-2.0")

add_executable(main main.cpp)
target_link_libraries(main PRIVATE PkgConfig::GTK)

这是我的main.cpp 用于测试:

#include <gio/gio.h>

int main ()  return 0; 

这是我在终端看到的:

alex@Alex-Desktop:~/test$ cmake -G Ninja -S . -B build -DCMAKE_BUILD_TYPE=Release
-- The C compiler identification is GNU 9.3.0
-- The CXX compiler identification is GNU 9.3.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1")
-- Checking for module 'gtk+-2.0'
--   Found gtk+-2.0, version 2.24.32
-- Configuring done
-- Generating done
-- Build files have been written to: /home/alex/test/build
alex@Alex-Desktop:~/test$ cmake --build build --verbose
[1/2] /usr/bin/c++  -isystem /usr/include/gtk-2.0 -isystem /usr/lib/x86_64-linux-gnu/gtk-2.0/include -isystem /usr/include/pango-1.0 -isystem /usr/include/atk-1.0 -isystem /usr/include/gdk-pixbuf-2.0 -isystem /usr/include/libmount -isystem /usr/include/blkid -isystem /usr/include/fribidi -isystem /usr/include/cairo -isystem /usr/include/pixman-1 -isystem /usr/include/harfbuzz -isystem /usr/include/glib-2.0 -isystem /usr/lib/x86_64-linux-gnu/glib-2.0/include -isystem /usr/include/uuid -isystem /usr/include/freetype2 -isystem /usr/include/libpng16 -O3 -DNDEBUG -pthread -MD -MT CMakeFiles/main.dir/main.cpp.o -MF CMakeFiles/main.dir/main.cpp.o.d -o CMakeFiles/main.dir/main.cpp.o -c /home/alex/test/main.cpp
[2/2] : && /usr/bin/c++ -O3 -DNDEBUG  CMakeFiles/main.dir/main.cpp.o -o main  /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so  /usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so  /usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so  /usr/lib/x86_64-linux-gnu/libatk-1.0.so  /usr/lib/x86_64-linux-gnu/libcairo.so  /usr/lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so  /usr/lib/x86_64-linux-gnu/libgio-2.0.so  /usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so  /usr/lib/x86_64-linux-gnu/libpango-1.0.so  /usr/lib/x86_64-linux-gnu/libgobject-2.0.so  /usr/lib/x86_64-linux-gnu/libglib-2.0.so  /usr/lib/x86_64-linux-gnu/libharfbuzz.so  /usr/lib/x86_64-linux-gnu/libfontconfig.so  /usr/lib/x86_64-linux-gnu/libfreetype.so && :

【讨论】:

是的,我已经以同样的方式解决了这个问题,我需要单独包含包。我使用了``` find_package(PkgConfig REQUIRED) pkg_check_modules(GTK REQUIRED IMPORTED_TARGET "gtk+-2.0")```

以上是关于在 Cmake 中包含 pkg-config --cflags --libs gtk+-2.0的主要内容,如果未能解决你的问题,请参考以下文章

在cmake的所有cpp文件中包含c ++标头[重复]

如何在 CMake 中包含 boost::future?

在 CMake 中包含 NSIS 脚本

在 cmake c++ 项目中包含库的首选方法是啥?

如何在我的 cmake 项目中包含另一个 cmake 项目的头文件?

如何在 CMake 项目中包含外部库