基于如何在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中定义,从中可以很容易地找出为什么只覆盖子模块失败。