Хобрук: Ваш путь к мастерству в программировании

dlopen() изображение ошибки не найдено

У меня есть программное обеспечение, которое сначала загружает .dylib и позволяет вызывать libFirst.dylib с помощью следующей команды:

void* handle = dlopen(path.c_str(), RTLD_LAZY | RTLD_GLOBAL);

Позже внутри функции из загруженной libFirst.dylib я пытаюсь загрузить другую .dylib, используя ту же команду, но для libSecond.dylib, загрузка этой общей библиотеки дает мне следующие предупреждения в моей консоли Xcode:

error warning: Ignored unknown object module at 0x129310 with type 0x8a8399

dlerror: dlopen(/path/libSecond.dylib, 9): Library not loaded: libFirst.dylib
  Referenced from: /path/libSecond.dylib
  Reason: image not found

Чего я не понимаю, так это того, что он говорит, что libFirst.dylib не загружен, но в настоящее время я нахожусь внутри функции из libFirst.dylib, так как же это может быть?

Все мои пути в DYLD_LIBRARY_PATH тоже кажутся правильными.

Заранее спасибо, я застрял на этом в течение нескольких дней.


  • Вы пробовали что-то вроде strace? Это может дать вам больше информации, чтобы увидеть, какой именно вызов не работает. 15.07.2011
  • Моя трассировка стека показывает функцию, которая вызывает dlopen под названием CreateModule в libSecond.dylib, которая является функцией внутри libFirst.dylib. 15.07.2011
  • Не трассировка стека - strace означает системную трассировку. Это отслеживает вызовы функций, такие как открытие файлов, определение индексных дескрипторов и т. д. Это может пролить свет на то, куда именно смотрит ваша ОС. 15.07.2011
  • Мне пришлось использовать dtruss, так как я работаю на OSX, но вот что происходит после открытия в libSecond.dylib: stat64(libFirst.dylib\0, 0xBFFFE0FC, 0x1)= -1 Err#2 stat64(/Users/mwildermuth /lib/libFirst.dylib\0, 0xBFFFE4DC, 0x1) = -1 Err#2 tat64(/usr/local/lib/libFirst.dylib\0, 0xBFFFE4DC, 0x1) = -1 Err#2 stat64(/usr/lib /libFirst.dylib\0, 0xBFFFE4EC, 0x1)= -1 Err#2 Затем после этого я получаю свою обычную ошибку из вопроса выше. Ни одно из местоположений не является правильным в вызовах stat64, может ли это быть причиной проблемы? Если да, то как мне это исправить. Еще раз спасибо за ваше время. 16.07.2011
  • Конечно - я не понаслышке знаю, как это может быть неприятно :) Да, похоже, что он просто ищет не в том месте. Я недостаточно знаю OSX, чтобы помочь вам в этом, но, возможно, есть путь поиска библиотеки, который вы можете исправить? 16.07.2011
  • Спасибо за все ваше время, я чувствую, что вы направили меня в правильном направлении 16.07.2011

Ответы:


1

В итоге я использовал -install_name, чтобы изменить имя установки всех моих библиотек на @rpath/dylibName.dylib, а затем в Xcode я установил пути поиска Runpath, используя @loader_path, чтобы найти все мои .dylib, которые я использовал.

22.07.2011
  • Привет @MartinDelille. Я сделал это более 3 лет назад, поэтому у меня нет точной командной строки, но вот блог о том, как ее использовать: log.zyxar.com/blog/2012/03/10/имя-установки-на-os-x 27.10.2014

  • 2

    использовать:

    install_name_tool -id @executable_path/../Frameworks/mylib.dylib mylib.dylib
    

    затем проверьте это с помощью:

    otool -D mylib.dylib
    
    20.05.2018

    3

    Я думаю, что более простым способом обойти эту ошибку было бы вернуться к более ранней версии, в которой вы не получали эту ошибку. Щелкните правой кнопкой мыши папку проекта и перейдите к локальной истории, чтобы вернуться к более ранней версии. Я проверил, что это работает в студии Android, установленной в Mac OS Big sur.

    03.02.2021
    Новые материалы

    Деревья классификации и регрессии
    Это мой второй пост об алгоритмах машинного обучения. Мой первый пост посвящен искусственным нейронным сетям, вы можете найти его ниже. Нейронные сети — базовое..

    HMTL - Многозадачное обучение для решения задач НЛП
    Достижение результатов SOTA путем передачи знаний между задачами Область обработки естественного языка включает в себя десятки задач, среди которых машинный перевод, распознавание именованных..

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..