Nix-Shell中Glib头文件异常问题及正确配置咨询
我尝试在NixOS上构建依赖Glib的GTK4应用,使用如下shell.nix配置启动nix-shell:
{ pkgs ? import <nixpkgs> {} }: pkgs.mkShell { nativeBuildInputs = with pkgs.buildPackages; [ libgcc glib clang-tools ]; }
编写的main.cpp内容为:
#include <glib-2.0/glib.h> int main(){ }
执行g++ main.cpp时出现编译错误:
/nix/store/f8y44c3k32piprp8wj999cdlakpz86kz-glib-2.80.2-dev/include/glib-2.0/glib.h:32:10: fatal error: glib/galloca.h: No such file or directory
32 | #include <glib/galloca.h>
| ^~~~~~~~~~~~~~~~
compilation terminated.
此外,依赖库shumate期望使用#include <glib.h>引入头文件,但当前nix-shell中的Glib仅支持#include <glib-2.0/glib.h>。请问如何在nix-shell中正确配置使用Glib进行开发?
1. 修复头文件路径问题
Glib的头文件结构需要编译器能找到嵌套的glib/子目录,pkg-config可以自动处理这些路径。修改shell.nix,添加pkg-config并调整依赖:
{ pkgs ? import <nixpkgs> {} }: pkgs.mkShell { nativeBuildInputs = with pkgs.buildPackages; [ gcc glib clang-tools pkg-config ]; }
2. 正确编译代码
启动nix-shell后,使用以下命令编译,pkg-config会自动注入正确的头文件搜索路径和链接参数:
g++ main.cpp $(pkg-config --cflags --libs glib-2.0)
3. 支持#include <glib.h>写法
通过pkg-config提供的参数,编译器会自动搜索glib-2.0目录,此时代码可以直接写:
#include <glib.h>
嵌套的glib/galloca.h也能被正确解析。
额外优化:自动设置环境变量
如果不想每次编译都手动输入pkg-config参数,可以在shell.nix中添加shellHook自动设置环境变量:
{ pkgs ? import <nixpkgs> {} }: pkgs.mkShell { nativeBuildInputs = with pkgs.buildPackages; [ gcc glib clang-tools pkg-config ]; shellHook = '' export CFLAGS="$(pkg-config --cflags glib-2.0)" export LDFLAGS="$(pkg-config --libs glib-2.0)" ''; }
之后编译只需执行:
g++ main.cpp $CFLAGS $LDFLAGS
内容的提问来源于stack exchange,提问作者myaumyau

