У меня есть библиотека 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 #, а одной из функций в моей общей библиотеке, которая вызывает функцию, которая затем не найдена. (спасибо - Хэнк)