在 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的主要内容,如果未能解决你的问题,请参考以下文章