Cabal не может найти чужую библиотеку при сборке на NixOS

Я пытаюсь создать внутренний проект Haskell на NixOS с помощью cabal2nix. Он является оболочкой (и, следовательно, зависит от) сторонней библиотеки, которую в Ubuntu можно построить, wget установив исходный код, а затем запустив make && make install && ldconfig. Таким образом, когда Cabal приступает к созданию программы, он, по-видимому, может найти соответствующие файлы заголовков (которые находятся в /usr/local/include/ta-lib или /usr/include/ta-lib).

На Nix процесс, как я понимаю, состоит в том, чтобы настроить файл .nix, чтобы указать, как получить и собрать исходный код, а затем Nix настраивает изолированные среды сборки. Когда я это делаю, сторонняя библиотека извлекается и собирается соответствующим образом.

Когда Nix запускает этап настройки, все выглядит нормально:

configureFlags: --verbose --prefix=/nix/store/fwpw03bd0c2m5yb7v2wc7g6f0qj912ra-talib-0.1.0.0 --libdir=$prefix/lib/$compiler --libsubdir=$pkgid --with-gcc=gcc --package-db=/tmp/nix-build-talib-0.1.0.0.drv-0/package.conf.d --ghc-option=-optl=-Wl,-rpath=/nix/store/fwpw03bd0c2m5yb7v2wc7g6f0qj912ra-talib-0.1.0.0/lib/ghc-7.10.2/talib-0.1.0.0 --enable-split-objs --disable-library-profiling --disable-executable-profiling --enable-shared --enable-library-vanilla --enable-executable-dynamic --enable-tests --extra-include-dirs=/nix/store/gvglncjgd5yif9bc03qalmp2mrjp524n-ta-lib-0.4.0/include --extra-lib-dirs=/nix/store/gvglncjgd5yif9bc03qalmp2mrjp524n-ta-lib-0.4.0/lib

При установке --extra-include-dirs и --extra-lib-dirs на правильные пути в магазине Nix. Однако, когда он идет на сборку, он жалуется,

Setup: Missing dependency on a foreign library:
* Missing C library: ta_lib

К сожалению, я не понимаю, как клика определяет, присутствует ли иностранная библиотека. Я читал здесь (Haskell, как разрешить ошибку клики : Отсутствуют зависимости от сторонних библиотек?) эта группа попытается создать и связать программу C, состоящую из каждого найденного заголовка. Итак, почему-то он не находит правильную библиотеку.

Что случилось? Связано ли это с запуском ldconfig в Ubuntu?


person Charles Cooper    schedule 24.12.2015    source источник
comment
Что такое ta-lib? Не могу найти в Nixpkgs.   -  person Peter Simons    schedule 05.01.2016
comment
ты прав, это не в nixpkgs. вот мой файл ta_lib.nix: gist.github.com/charles-cooper/0bd4398f223e64ba52f6   -  person Charles Cooper    schedule 05.01.2016


Ответы (1)


Проблема в том, что ta_lib зависит от системной математической библиотеки m, но по умолчанию эта библиотека не связана. Вы можете проверить это, создав программу-заглушку C

echo "int main() { return 0; }" >test.c

и пытаюсь связать это с ta_lib:

$ nix-shell -p ta_lib --run "gcc test.c -lta_lib"
/nix/store/ghinzmxfm2s41nz8y873jlywwmcbw38l-ta-lib-0.4.0/lib/libta_lib.so: undefined reference to `sinh'
/nix/store/ghinzmxfm2s41nz8y873jlywwmcbw38l-ta-lib-0.4.0/lib/libta_lib.so: undefined reference to `sincos'
[...]
collect2: error: ld returned 1 exit status

Теперь, когда Cabal пытается определить, доступна ли библиотека, он попытается связать ее с тестовой программой-заглушкой, но эта попытка не удастся из-за всех этих неопределенных символов. Следовательно, Кабал жалуется, что библиотека не может быть связана (даже если ее пути настроены и настроены правильно).

Чтобы решить эту проблему, добавьте библиотеку m к атрибуту extra-libraries в файле Cabal вашего проекта, например:

extra-libraries: ta_lib, m

Это должно сделать фазу настройки Кабала успешной.

person Peter Simons    schedule 06.01.2016
comment
Работал как шарм. Спасибо! - person Charles Cooper; 07.01.2016
comment
У меня такая же проблема с python, python2 or pepper. Добавление их в дополнительные библиотеки не сработает, пока tar, jq работает. Это та же проблема? Если да, то каков обходной путь? Я пробовал это предложение, но безуспешно. - person Pierre R; 18.05.2018
comment
У меня такая же проблема, но с довольно стандартными библиотеками, такими как libmnl, который является частью Nixpkgs. Я запускаю ту же команду gcc test.c -lmnl, и она работает, но Кабал все еще не может найти программу. - person CMCDragonkai; 07.04.2019