Поведение Windows заключается в поиске зависимых библиотек в каталоге, из которого происходит .dll
, поэтому, когда jna загружает библиотеку в память, оттуда также загружается зависимая библиотека.
Если вы запустите окно терминала и перейдете в каталог, в котором существует .so
, и выполните команду:
ldd ./libGTransTF.so
и это означает, что она не может найти библиотеку libCoreGTrans.so
, тогда вы можете видеть, что порядок поиска не найдет это местоположение.
Загрузчик ссылок во время выполнения (ld.so
) использует набор решений о том, где искать библиотеки. Поведение по умолчанию не включает каталог, в котором была найдена библиотека.
Вы можете добавить опцию в библиотеку при сборке для поиска в определенных местах, чтобы найти библиотеки. Когда вы создаете библиотеку, вы можете сказать, чтобы искать в каталоге, что .so
происходит от во время выполнения , добавив строку:
-Wl,-rpath,'$ORIGIN'
к строке ссылки. Он должен заполняться константным значением $ORIGIN
, иначе это не сработает, так что это может быть немного сложно сделать правильно в make-файле. Это значение, которое разрешается во время выполнения.
Это все очень хорошо и хорошо, если вы собираете библиотеку самостоятельно, но если вы получаете библиотеки откуда-то еще или уже собрали их и не хотите восстанавливать их, вы можете использовать инструмент, такой как patchelf
, чтобы отредактировать путь поиска для .so
, чтобы добавить его исходное местоположение:
patchelf --set-rpath '$ORIGIN' libGTransTF.so
Затем, когда вы запустите:
ldd ./libGTransTF.so
он сможет успешно найти библиотеку libCoreGTrans.so
.