2015-12-24 3 views
1

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

В 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 how to resolve cabal error: Missing dependencies on foreign libraries?), что cabal попытается построить и связать программу C, которая состоит из каждого найденного заголовка. Итак, почему-то это не находит правильную библиотеку.

Что не так? Это связано с шагом в Ubuntu для запуска ldconfig?

+0

Что такое 'ta-lib'? Я не могу найти его в Nixpkgs. –

+0

Вы правы, это не в nixpkgs. вот мой файл ta_lib.nix: https://gist.github.com/charles-cooper/0bd4398f223e64ba52f6 –

ответ

2

Проблема в том, что 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 пытается определить, доступен ли библиотека, он будет пытаться связать его в программу тестирования заглушки, но эта попытка потерпит неудачу из-за всего этого неопределенного символа. Следовательно, Cabal жалуется, что библиотека не может быть связана (даже если ее пути настроены и настроены правильно).

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

extra-libraries: ta_lib, m 

Это должно сделать Cabal настроить фазу успеха.

+0

Работал как шарм. Спасибо! –

Смежные вопросы