Офер за 1 день в команду BetterMe (Frontend Hiring, JavaScript/React/Redux)
×Закрыть

Статические либы, Linux, Cmake

Господа линуксоиды подскажите.

Есть такой большой продукт Kaldi. Я его собираю по инструкции и он работает.
Но мне нужно заюзать либы из него. Во время сборки он создает статические либы:
KALDI_LIBRARIES: /home/viktor/Work/kaldi/src/decoder/kaldi-decoder.a;/home/viktor/Work/kaldi/src/feat/kaldi-feat.a;/home/viktor/Work/kaldi/src/gmm/kaldi-gmm.a;/home/viktor/Work/kaldi/src/hmm/kaldi-hmm.a;/home/viktor/Work/kaldi/src/lat/kaldi-lat.a;/home/viktor/Work/kaldi/src/matrix/kaldi-matrix.a;/home/viktor/Work/kaldi/src/transform/kaldi-transform.a;/home/viktor/Work/kaldi/src/tree/kaldi-tree.a;/home/viktor/Work/kaldi/src/util/kaldi-util.a;/home/viktor/Work/kaldi/src/base/kaldi-base.a

В cmakelist.txt делаю следующее:
add_executable(${NAME} ${${NAME}_SRCS})
target_link_libraries(${NAME} ${Boost_LIBRARIES} ${KALDI_LIBRARIES} ${OPENFST_LIBRARY} ${BLAS_LIBRARIES})

Но при сборке проекта ловлю следующую проблему:
/home/viktor/Work/kaldi/src/tree/kaldi-tree.a(build-tree.o): In function `kaldi::GenRandStats(int, int, int, int, std::vector<int, std::allocator<int=""> > const&, std::vector<int, std::allocator<int=""> > const&, std::vector<bool, std::allocator<bool=""> > const&, bool, std::vector<std::pair<std::vector<std::pair<int, int="">, std::allocator<std::pair<int, int=""> > >, kaldi::Clusterable*>, std::allocator<std::pair<std::vector<std::pair<int, int="">, std::allocator<std::pair<int, int=""> > >, kaldi::Clusterable*> > >*)’:
/home/viktor/Work/kaldi/src/tree/build-tree.cc:103: undefined reference to `kaldi::VectorBase<float>::Sum() const’
/home/viktor/Work/kaldi/src/tree/build-tree.cc:104: undefined reference to `kaldi::VectorBase<float>::Sum() const’
и т.д.

QtCreator пишет дополнительно пишет: File not found /home/viktor/Work/kaldi/src/tree/kaldi-tree.a(build_tree.o).

То бишь не находит нужных функций в подключаемых либах или их таки не прилинковывает.

Ключи для сборки:
SET (CMAKE_C_FLAGS “-std=c++11 -Wall -Wextra”)
SET (CMAKE_CXX_FLAGS “${CMAKE_C_FLAGS}”)

Возможно нужно еще какие ключи добавить?
Или куда копать подскажите?

👍НравитсяПонравилось0
В избранноеВ избранном0
LinkedIn

Похожие топики

Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Нужна помощь нубо-ебунту. Как я его ненавижу... Проблема:
WinSCP. Одно окошечкО на виндовском компе, второе на сервере под ебунту (обычный файловый редактор). Когда меняю файл на винде и перетаскиваю левой кнопочкой мышички на сервер, оно не запускаетсо, бо «:No such file in directory». Как там совместимость настроить? А то приходится открывать на сервере какой то рабочий файл блокнотиком и туда втупую копировать код из файла которого якобы нет....

Ну попробую угадать. Файл действительно копируется. В линухах есть специфические права (в отличие от винды) — например разрешение на выполнение файла. В общем в свойствах файла поставь птичку у нужном месте (или chmod используй).
Второе. Скрипты часто запускаются так ./script — почему так, не знаю, спрашивай у тех, кто хорошо знает линух.
А вообще линух поприятнее винды даже в части потребления памяти.
Ну и еще поставь виртуалку и в ней тренируйся.

Не чмод стоит на запускание ls файл видит зелененьким и запуск идет через точку и палочкой, но при запуске «нет файла». Може винда что то там допиливает к файлу и как убрать хз. Чувствую себя идиотом... Минт не ставится на виртуалку хз почему, у других стоит минт — никаких проблем с совместимостью потяно шо нету :(

Ну если нет, то значит какого-то файла дейтсвительно нет. Ты кстати не екзешник виндовый путаешься запускать? (тогда ставь Вайн или собирай в линухе). Причем не забывай, про версии линкуемых либ.
Ну и на последние VirtualBox (5, причем он меня наконец-то стал удовлетворять больше VMWare) линухминт ставиться прекрасно (только у них недавно cinnamon хакнули, так что с ним аккуратно смотри, какой скачивать).
У баша есть ключик -x, что позволяет отображать все выполняемые команды.

Ты кстати не екзешник виндовый путаешься запускать?
не, обычный скрипт *.R
Ну лано, спасибо, ставить минт буду на бокс :(

Вероятнее всего у тебя там отсутсвует некий файл, что используется скриптом. Я вот пару дней назад 2 часа бился, почему у меня файл ненаходиться. Глаза замылились и в баш скрипте я путал путь с переменной цикла баша.
Ну а виртуалки. Я сейчас фактически перешел на них. Вечный зоопарк со студиями и версиями линухов у заказчиков либо провоцирует засирать хостовую систему либо делать виртуалки.
Как-нибудь, когда будет время, попробую докер заюзать для этих целей.

blah.R: /usr/bin/R^M: No such file or directory

Убирается через dos2unix, а лучше настройкой редактора.

Спасибо !! В тупую надо было передачу «текстовую» сделать, а не по «умолчанию». Тупое у редактора «умолчание» ...

Уже нашел порядок зависимостей. А еакже попробую группы. Всем спасибо.

Пробовали ключи start-group, end-group?

Вот что на SO нашел


The GNU ld linker is a so-called smart linker. It will keep track of the functions used by preceding static libraries, permanently tossing out those functions that are not used from its lookup tables. The result is that if you link a static library too early, then the functions in that library are no longer available to static libraries later on the link line.

The typical UNIX linker works from left to right, so put all your dependent libraries on the left, and the ones that satisfy those dependencies on the right of the link line. You may find that some libraries depend on others while at the same time other libraries depend on them. This is where it gets complicated. When it comes to circular references, fix your code!

Как я понял в GNU ld решили эту проблему с порядком линковки либ.

Как посмотреть, какой линкер используется?
И как его заменить для сборки на GNU ld?

Как посмотреть, какой линкер используется?

ld -V
Только там будет или GNU ld, или маловероятно GNU gold.

Можно попробовать группу из этих kaldi сделать, -( -)
Ниже по ссылке на SO есть.

Спробуй перед ключами додати рядок:

SET(CMAKE_EXE_LINKER_FLAGS «-static»)

Проблема скорее всего в linking order.

stackoverflow.com/...times-cause-errors-in-gcc

Наверное стоит прописать зависимости между статическими либами Kaldi (через target_link_libraries).

Список либ приличный, как его подобрать без перебора всех вариантов.
Нюанс в том, so этот kaldi не делает и явно в доке ключей для сборки shared не указано.
Фишка в том, что его разработчики собирают большую пачку екзешников и склеивают их через перл и баш скрипты (такое вот своеобразное программирование у американцев).
А мне понадобилось добавить немного другую функциональность и, в линукс я сильно неопытен еще.
Причем вот у этого github.com/usc-sail/barista как бы всё работает (но во внутренности я не лез, у него стянул FindKaldi.cmake).

Подписаться на комментарии