msgstr "ошибка поиска символа:" при выполнении из другого каталога, иначе работает как задумано при выполнении из каталога сборки - PullRequest
0 голосов
/ 06 февраля 2020

У меня странная проблема в Ubuntu Linux 18.04, которая появилась после нескольких попыток запуска pytest. Проект в основном c ++, но он также генерирует привязки pybind11 и генерирует библиотечные файлы с помощью CMake.

Моя цель - заставить программу выводить свои файлы в заданный каталог c в папке проекта, т.е. в том же каталоге, где находится исполняемый файл. Раньше я добивался этого, выполняя эту команду:

user@computer_name:~/Dev/project$ (cd /home/user/Dev/project/unittests/test_output && "/home/user/Dev/project/./executable" -pdbin /home/user/Dev/project/unittests/test_data/3v8x.pdb -mtzin /home/user/Dev/project/unittests/test_data/3v8x_phases.mtz && cd /home/user/Dev/project)

Эта команда работала так, как задумывалось, до сегодняшнего дня, когда я запускал несколько экземпляров pytest. Хотя pytest может успешно завершить все тесты, моя вышеупомянутая команда больше не работает и выдает мне эту ошибку:

user@computer_name:~/Dev/project$ /home/user/Dev/project/./executable: symbol lookup error: /home/user/Dev/project/./executable: undefined symbol: _ZN7library7Class11functionEv

Однако, когда я пытаюсь выполнить исполняемый файл в каталоге сборки, например это:

user@computer_name:~/Dev/project$ ./executable

Нет ошибок вообще, и если я попытаюсь дать программе свой ввод, программа будет работать так, как задумано, без каких-либо ошибок. Тем не менее, он выводит файлы в каталог сборки - место, где я не хочу вывод на go.

Для дальнейшего подтверждения я попытался выполнить программу из другого каталога снова без давая ему любой ввод:

user@computer_name:~/Dev/project/unittests$ .././executable

, чтобы встретить еще раз с этой ошибкой:

.././project: symbol lookup error: .././project: undefined symbol: _ZN7library7class11functionEv

До сих пор я пытался перестроить весь проект, сгенерировать новые Makefiles et c ,

Я также подтвердил, что с самой программой проблем нет. Любые идеи о том, как решить эту проблему или альтернативные способы направить вывод в другую папку, не передавая указанные c выходные аргументы самой программе?

1 Ответ

1 голос
/ 06 февраля 2020

Если вы хотите, чтобы executable взял libexecutable.so рядом с ним, у вас есть два варианта:

  • Настройка LD_LIBRARY_PATH на /home/user/Dev/project.
    . динамический c компоновщик ищет там перед любыми другими сконфигурированными каталогами.
    Либо делайте это глобально, либо в сценарии оболочки.
  • Скомпилируйте executable с помощью rpath. Это заставит поиск библиотек по executable сначала посмотреть в rpath. Если вы передадите флаг -Wl,-rpath,'$ORIGIN'/.. (обратите внимание на одинарные кавычки вокруг $ORIGIN!), Динамический компоновщик c всегда найдет libexecutable.so рядом с executable первым.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...