我有一个类似的问题:Cabal can't find foreign library when building on NixOS
基本上我正在使用cabal2nix
从包含以下内容的package.yaml中生成
extra-libraries:
- libmnl
这将产生一个cabal.nix文件:
{ mkDerivation, base, bytestring, cereal, containers, hpack
, iproute, lens, libmnl, netlink, primitive
, resourcet, safe-exceptions, stdenv, transformers
}:
mkDerivation {
pname = "relay";
version = "0.1.0.0";
src = ./.;
libraryHaskellDepends = [
base bytestring cereal containers iproute lens netlink
primitive resourcet safe-exceptions transformers
];
librarySystemDepends = [ libmnl ];
libraryToolDepends = [ hpack ];
testHaskellDepends = [
base bytestring cereal containers iproute lens netlink
primitive resourcet safe-exceptions transformers
];
testSystemDepends = [ libmnl ];
preConfigure = "hpack";
homepage = "https://github.com/MatrixAI/Relay#readme";
license = stdenv.lib.licenses.asl20;
}
如果我通过nix-shell
进行输入,然后运行cabal configure
。它抱怨找不到libmnl:
Resolving dependencies...
Configuring relay-0.1.0.0...
cabal: Missing dependency on a foreign library:
* Missing (or bad) C library: libmnl
This problem can usually be solved by installing the system package that
provides this library (you may need the "-dev" version). If the library is
already installed but in a non-standard location then you can use the flags
--extra-include-dirs= and --extra-lib-dirs= to specify where it is.If the
library file does exist, it may contain errors that are caught by the C
compiler at the preprocessing stage. In this case you can re-run configure
with the verbosity flag -v3 to see the error messages.
还在gcc -c test.c -lmnl
内的此文件上运行nix-shell
可以正常工作:
#include <libmnl/libmnl.h>
int main() { return 0; }
所以为什么阴谋集团找不到libmnl
,但是gcc
却可以在nix-shell
中轻松找到它。
使用-v3
运行时,似乎试图链接到-llibmnl
。但是正确的链接应该是-lmnl
。这似乎很成问题,是否有办法告诉cabal与标记-lmnl
而不是-llibmnl
链接?
我发现,如果我编辑Cabal文件并更改extra-libraries
指向mnl
而不是libmnl
,则可以通过更改Cabal尝试链接的方式来工作。但是,cabal2nix
然后在取package.yaml
时会产生libmnl
,这是Nix提供的正确包装属性。看来extra-libraries
应该是mnl
,而cabal.nix
应该是libmnl
。
答案 0 :(得分:1)
基本上,extra-libraries
需要使用mnl
而不是libmnl
。然后,在使用cabal2nix
时,它需要将libmnl
包映射到mnl
属性。上游cabal2nix映射mnl到libmnl commit:https://github.com/NixOS/cabal2nix/issues/413#event-2257811946