Linux, Mono, общие библиотеки и неразрешенные символы - PullRequest
2 голосов
/ 02 апреля 2009

У меня есть библиотека shim (shared, C ++), которая вызывает функции в другой разделяемой библиотеке (libexif) и представляет простой интерфейс для C # для вызовов Platform Invoke. (То есть программа на C # использует PInvoke для вызова моей пользовательской общей библиотеки, которая, в свою очередь, вызывает другую общую библиотеку.)

В Windows моя пользовательская общая библиотека связывается с общей библиотекой, когда моя пользовательская библиотека связывается и когда выполняется приложение C #, все символы разрешаются.

В Linux связывание моей общей библиотеки не связывает другую общую библиотеку. С драйвером C ++ я указываю другую библиотеку, когда приложение связано и в это время все символы разрешены. Однако при попытке вызвать мою общую библиотеку из программы на C # (скомпилированной с использованием моно) символы в другой общей библиотеке не разрешаются. Я пытался использовать переменную MONO_PATH, чтобы указать другую библиотеку, но, похоже, это не имеет значения. Я также попытался указать неразрешенную функцию в операторе DLLimport, но, похоже, это тоже не помогло.

Как мне указать разделяемую библиотеку, которая не вызывается напрямую кодом C #, чтобы mono / cli находил ее во время выполнения?

Я использую следующие команды для создания общей библиотеки:

g++ -fPIC -g -c -Wall  libexif-wrapper.cpp
g++ -shared -Wl,-soname,libexif-wrapper.so.1     -o libexif-wrapper.so.1.0.1 libexif-wrapper.o -lc
ar rcs libexif-wrapper.a libexif-wrapper.so.1

И следующая командная строка для компиляции моего драйвера C #:

mcs -unsafe -define:LINUX Test-libexif-wrapper.cs

При выполнении я получаю сообщение об ошибке, что символ, используемый моей общей библиотекой, не найден:

/usr/bin/cli: symbol lookup error: ../../../C/libexif-wrapper/libexif-wrapper/libexif-wrapper.so.1: undefined symbol: exif_data_new_from_file

(libexif-wrapper - это моя общая библиотека, которая служит оболочкой между приложением C # и libexif.)

Я не смог понять, как это решить. Любые предложения будут оценены.

изменить: Чтобы ответить на вопрос:

Вы уверены, что неуправляемый libexif-обертка может быть найдена в Переменная среды LD_LIBRARY_PATH?

На самом деле это не так. Я создал путь в DLLImport, чтобы указывать прямо на него. Среда выполнения находит его, потому что он сообщает путь к нему в сообщении об ошибке выше. Кроме того, отсутствующий символ вызывается не программой C #, а одной из функций в моей общей библиотеке, которая вызывает функцию, которая затем не найдена. (спасибо - Хэнк)

Ответы [ 2 ]

3 голосов
/ 03 апреля 2009

Вы должны указать зависимость, когда вы связываете библиотеку оболочки, как

g++ -shared -Wl,-soname,libexif-wrapper.so.1 -o libexif-wrapper.so.1.0.1 libexif-wrapper.o -lc -lexif

Когда вы это делаете, динамический компоновщик знает, что libexif-wrapper зависит от libexif, и он может разрешать символы при загрузке.

2 голосов
/ 03 апреля 2009

Я не понимаю, зачем вам нужно -lc, но, возможно, это странная моно ...

Работает ли это, если вы добавите -lexif в команду ссылки? Похоже, что вы создаете общую библиотеку с неопределенными символами, но не говорите , где эти символы должны исходить. Иногда это действительно полезно - скажем, создание плагина, который использует символ, который, как ожидается, уже будет предоставлен приложением, загружающим его, - но не то, что вы хотите здесь; Я не понимаю, как libdl (или, тем не менее, Mono загружает библиотеки, возможно, у него есть собственная реализация), узнает, что ему нужно загрузить libexif.so для использования в вашей библиотеке.

Надеюсь, вам не нужно делать что-то ужасное, например, добавить libexif.so в архив ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...