| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > Линькер не может найти символы. |
| Автор: phprus 27.2.2012, 13:28 | ||
| Доброго времени суток! Пытаюсь создать приложение, которое будет полностью переносимым (в файловой системе), следовательно все пути к библиотекам указаны через rpath. Есть OpenCV, который скомпилирован с поддержкой CUDA 4.0 и путь к CUDA-библиотекам указан через относительный rpath. ldd, показывает, что все зависимые библиотеки успешно находятся. Также на сервере установлена 4.1, пути к которой прописаны в /etc/ld.so.conf.d/. При попытке скомпилировать приложение, в зависимостях которого оказывается библиотека libopencv_gpu.su возникает ошибка:
При компиляции приложения указывается абсолютный rpath к каталогу ~/opt/icmm/opencv/2.3.1/lib64/. Похоже, что линькер пытается найти эти символы в системной CUDA 4.1, а не в той, с которой скомпилирована opencv. Подскажите пожалуйста, как можно решить эту проблему? Ситуация осложняется тем, что я в общем случае не знаю скомпилирован ли OpenCV с поддержкой CUDA и если да, то какой версии. |
| Автор: boostcoder 27.2.2012, 17:13 |
| покажи командную строку линкера. |
| Автор: phprus 28.2.2012, 11:19 | ||
| boostcoder, Строка линькера сгенерирована cmake:
|
| Автор: boostcoder 28.2.2012, 12:06 | ||
| phprus, последний пост у тебя нормально отображается? у меня он шесть экранов в ширину. к тому же, командная строка такого объема совершенно нечитаема)
зы а что, cлов "нечитаем"/"нечитаема" нет в русском языке? или они как-то иначе пишутся? |
| Автор: phprus 29.2.2012, 10:37 |
| boostcoder, bsa, Упс... Прошу прощения, написал пост и убежал совершенно не посмотрев, как он выглядит. Был удивлен, что тег code так разъезжается... На той системе, где это собирается я не рут, по этому так сделать мне никто не даст, а в тестовом окружении попробую проверить. |
| Автор: phprus 29.2.2012, 12:53 | ||||
А если системной нет вообще, то все еще хуже:
При этом:
Из чего можно сделать вывод, что библиотеки успешно находятся библиотекой libopencv_gpu.so. Необходимо отметить, что библиотеки cuda не содержат в себе RPATH. |
| Автор: boostcoder 29.2.2012, 13:05 | ||
так эти символы, в какой библиотеке присутствуют? в системной, или в той другой? |
| Автор: phprus 29.2.2012, 14:03 | ||
Эти символы только в кастомной (4.0). ABI немножко поломалось в версиях 4.0/ 4.1. Но я пока не очень понимаю почему линькер проверяет зависимости используемых библиотек и при этом похоже не смотрит на их RPATH... |
| Автор: phprus 3.3.2012, 17:41 |
| Сделал workaround на базе добавления в -rpath-link всех возможных каталогов проекта, в которых есть .so файлы. Теперь все компилируется и работает так, как и задумано. Осталось только понять, почему линькер отказывался использовать RPATH библиотек для поиска их зависимостей... |