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