2013-09-24 2 views
0

Я программирую с использованием C++ и Qt Creator. Мне нужно включить библиотеки, которые я использую в папку проекта, чтобы программа могла быть реализована на любом устройстве. Что мне делать в точности?Включите библиотеки в мою папку проекта

Я знаю, что я должен изменить файл .pro и я уже попытался это:

LIBS+=-L"$$_PRO_FILE_PWD_/libs" \ 
-lvl \ 

Но это не работает. Я получаю эту ошибку: ошибка при загрузке разделяемых библиотек: libvl.so: невозможно открыть файл общих объектов: нет такого файла или каталога

Любые идеи? Thanks

+0

В чем проблема? Разве компилятор не находит библиотеки? Если 'lvl' является lib, вам нужно добавить префикс' -l', чтобы фактически добавить его в список libs для ссылки. – thokra

+0

Эта ошибка: Ошибка при загрузке разделяемых библиотек: libvl.so: невозможно открыть файл общих объектов: Нет такого файла или каталога – triple13

+0

@thokra да, у меня уже есть его как -lvl в моей программе, но когда я сделал копию вставки в forum the - was gone: D – triple13

ответ

0

Прежде всего, на Linux qmake создает Make-файлы, которые используются для управления процессом сборки. При добавлении линии

LIBS+=-L"$$_PRO_FILE_PWD_/libs" -lvl 

в файл .pro, QMAKE будет следить за тем, что соответствующая целевая Makefile генерируется повествующий компоновщик для поиска дополнительных библиотек в $$_PRO_FILE_PWD_/libs и ссылку на библиотеку libvl.so когда связывая с исполняемый файл.

Однако то, что вы испытываете, является проблемой . Более конкретно, ld-linux.so.2 попытается найти и динамически загружать общие библиотеки, например libvl.so, по адресу runtime. Это происходит при использовании встроенного, например, /usr/lib и определенных пользователем (и/или распределенных) путей при загрузке исполняемого файла. Я отсылаю вас к соответствующему man page для ld-linux.so.2 и man page для ldconfig, который используется для настройки пользовательских путей поиска библиотеки стандартным способом.

Когда ld-linux.so.2 пытается найти библиотеки, он ищет хорошо определенный набор каталогов (все разделённые двоеточия) в следующем порядке:

  • , если присутствует, так называемый DT_RPATH, который может быть записан в исполняемая библиотека (устарела).
  • LD_LIBRARY_PATH (по крайней мере, для большинства исполняемых файлов, обратитесь к странице за исключением)
  • DT_RUNPATH, который не заменяет DT_RPATH (если таковые имеются), но задерживает поиск до тех пор, после того, как LD_LIBRARY_PATH был обработан. RPATH и RUNPATH могут использоваться для имитации поведения, например, в Windows, где также просматривается путь исполняемого файла. LD_LIBRARy_PATH, однако, намного лучше подходит для этой цели.
  • имена библиотек, присутствующих в кэш-файле /etc/ld.so.cache который генерируется ldconfig с использованием каталогов, указанных в /etc/ld.so.conf/ и, возможно, дополнительных файлов, либо непосредственно упоминается путем включения в ld.so.conf или не указано иное
  • в доверенные каталоги, /lib и /usr/lib

Если ни один из указанных выше путей не содержит соответствующего общего объекта, вы получите сообщение об ошибке, которое не может быть загружено ld-linux.so.2.

Решение в вашем случае просто и прийти в некотором многообразии:

  • перед выполнением программы, установите переменные окружения LD_LIBRARY_PATH с помощью export LD_LIBRARY_PATH={yourSearchPaths}.
  • добавьте LD_LIBRARY_PATH к вызову исполняемого файла в командной строке, например. LD_LIBRARY_PATH={yourSearchPaths} ./{executable}
  • предоставляют исполняемый сценарий запускающего сценария запуска, например. start.sh, который делает это для вас, а затем просто выполняет shell-скрипт ./start.sh
+0

Что это такое, когда люди голосуют без комментариев? – thokra

+0

@ thokra..thanks так много для подробного объяснения..и изменил строку в .pro-файле на: «LIBS + = - L» $$ PWD/libs «-lvl», и это не сработало. Я попробовал весь проект на другом устройстве ... и вот супер ... он отлично работает .. даже несмотря на то, что в обоих устройствах все одно и то же. Возможно, просто версия QT Creator отличается ... все равно большое спасибо :) – triple13

+0

@ triple13: Что вы имеете в виду * устройство *? Кроме того, QtCreator просто анализирует файл '.pro' и делает это в среде IDE соответственно. QtCreator делает * не * вклад в сборку или время выполнения (кроме запуска исполняемого файла и, возможно, указания рабочего каталога). – thokra

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