如何在Nix项目中使用Qt*和子模块*的调试构建



基于如何在qt库中创建带有调试符号的qt 5.5开发shell,并查看qtbase.nix,我在default.nix:中尝试了这一点

with import <nixpkgs> {};
stdenv.mkDerivation {
name = "myapp";
buildInputs = [ 
(qt5.qtbase.override { debug = true; }) 
qt5.qtdeclarative 
qt5.qtgraphicaleffects 
qt5.qtimageformats 
qt5.qtquickcontrols2 
qt5.qttools 
...unrelated deps... 
];
}

这似乎成功地构建了Qt,但当调用nix-shell时,我得到了错误:

Error: detected mismatched Qt dependencies:
/nix/store/2w9sd3z24hhxvllk47xwflwcsh318k1q-qtbase-5.15.3-dev
/nix/store/74ly900da8fi9b5vvmyqzi4yqa84p0sz-qtbase-5.15.3-dev

谷歌为这个错误消息找到的极少数点击似乎与这种情况无关。

在查看了strace输出和drv文件后,我直觉到qtdeclarative可能仍在使用qtbase的非重写版本,所以我尝试了:

with import <nixpkgs> {};
let myqtbase = qt5.qtbase.override { debug = true; }; in
let myqtdecl = qt5.qtdeclarative.override { qtbase = myqtbase; }; in
stdenv.mkDerivation {
name = "myapp";
buildInputs = [
myqtbase
myqtdecl
(qt5.qtgraphicaleffects.override { qtdeclarative = myqtdecl; })
(qt5.qtimageformats.override { qtbase = myqtbase; })
(qt5.qtquickcontrols2.override { qtdeclarative = myqtdecl; })
(qt5.qttools.override { qtbase = myqtbase; qtdeclarative = myqtdecl; })
...unrelated deps...
];
}

这一次,它早些时候失败了,出现了基本相同的问题:

these 5 derivations will be built:
/nix/store/khxivycbzgvjcxypa1im98grvpnjp2rd-qtdeclarative-5.15.3.drv
/nix/store/bax6i6afc6bgc6qjgbrps8l5q3r3fbis-qttools-5.15.3.drv
/nix/store/hhcnis5nh4raixqajj67zvak7xx44q3y-qtimageformats-5.15.3.drv
/nix/store/jl43kcgfm9svrnddja9bi0kwhqxrcs27-qtgraphicaleffects-5.15.3.drv
/nix/store/wjhaakqxzdk5x5j315mx16rdqagrnavl-qtquickcontrols2-5.15.3.drv
building '/nix/store/khxivycbzgvjcxypa1im98grvpnjp2rd-qtdeclarative-5.15.3.drv'...
Error: detected mismatched Qt dependencies:
/nix/store/74ly900da8fi9b5vvmyqzi4yqa84p0sz-qtbase-5.15.3-dev
/nix/store/2w9sd3z24hhxvllk47xwflwcsh318k1q-qtbase-5.15.3-dev
error: builder for '/nix/store/khxivycbzgvjcxypa1im98grvpnjp2rd-qtdeclarative-5.15.3.drv' failed with exit code 1;
last 3 log lines:
> Error: detected mismatched Qt dependencies:
>     /nix/store/74ly900da8fi9b5vvmyqzi4yqa84p0sz-qtbase-5.15.3-dev
>     /nix/store/2w9sd3z24hhxvllk47xwflwcsh318k1q-qtbase-5.15.3-dev
For full logs, run 'nix log /nix/store/khxivycbzgvjcxypa1im98grvpnjp2rd-qtdeclarative-5.15.3.drv'.
error: build of '/nix/store/bax6i6afc6bgc6qjgbrps8l5q3r3fbis-qttools-5.15.3.drv', '/nix/store/hhcnis5nh4raixqajj67zvak7xx44q3y-qtimageformats-5.15.3.drv', '/nix/store/jl43kcgfm9svrnddja9bi0kwhqxrcs27-qtgraphicaleffects-5.15.3.drv', '/nix/store/khxivycbzgvjcxypa1im98grvpnjp2rd-qtdeclarative-5.15.3.drv', '/nix/store/wjhaakqxzdk5x5j315mx16rdqagrnavl-qtquickcontrols2-5.15.3.drv' failed

在这一点上,我不知道是什么或在哪里试图引入不同版本的qtbase(都是-dev!(,也不知道为什么,我也没有主意了。

我还看了https://nixos.org/manual/nixpkgs/stable/#sec-pkg覆盖从以前的Q&A、 但我对尼克斯的熟悉程度还不够深,无法真正理解那里写的东西。

暂停?

好吧,在default.nix中,您覆盖了错误的属性。正确的方法是:

with import <nixpkgs> {};
let
qt5-debug = pkgs.qt5.override {
developerBuild = true;
debug = true;
};
in stdenv.mkDerivation {
name = "myapp";
buildInputs = [ 
qt5-debug.qtbase 
qt5-debug.qtdeclarative 
qt5-debug.qtgraphicaleffects 
qt5-debug.qtimageformats 
qt5-debug.qtquickcontrols2 
qt5-debug.qttools 
];
}

结果:

file  /nix/store/xd3..-qtbase-5.15.3/lib/libQt5Gui.so.5.15.3
/nix/store/xd3..-qtbase-5.15.3/lib/libQt5Gui.so.5.15.3: 
ELF shared object, 64-bit LSB x86-64, not stripped

不幸的是(或幸运的是(nix是一种成熟的编程语言,具有无限递归和其他高级函数实用程序。这意味着巨大的灵活性,这很好。但有时,只需查看nixpkgs中的源代码即可。正确的参数在qt5的default.nix中定义,从中可以很容易地找出为什么只覆盖子模块失败。

最新更新