Правильный способ создания и использования общих библиотек Rust?
Я работаю над привязками для библиотеки cpp. Для этого я написал capi / wrapper для библиотеки и скомпилировал его в общую библиотеку (файл.so).
У меня вопрос: как мне затем использовать и интегрировать этот файл в груз, не заставляя пользователя устанавливать его? В настоящее время я собираю cpp через Makefile, вызываемый из переменной build в Cargo.toml, но я не уверен, что делать с скомпилированной библиотекой.
Для тестирования я могу использовать rpath или LD_LIBRARY_PATH, чтобы указать исполняемый файл в правильном месте, но это не будет работать при распространении библиотеки.
Как люди справляются с этим?
1 ответ
Прежде всего, определите, действительно ли вам нужна разделяемая библиотека. Это не ясно из вашего вопроса, но если вы скомпилировали свою собственную обертку в разделяемую библиотеку, это, вероятно, не нужно - вы можете скомпилировать свой код в статическую библиотеку и связать ее непосредственно с исполняемым файлом.
Более того, вы также можете попытаться статически связать эту стороннюю библиотеку. Я не думаю, что это должно быть сложно. И да, вам нужно использовать build
Команда в манифесте, чтобы сделать все это сейчас.
Однако, если вам все еще нужно использовать разделяемую библиотеку и вы не хотите, чтобы конечный пользователь устанавливал ее самостоятельно (что странно, потому что в этом смысл разделяемых библиотек), вы должны распространять ее вручную. Например, вы можете написать make-файл, который собирает архив, который ваши пользователи могут извлечь и использовать. Чтобы ваша программа правильно находила библиотеку, у вас будет пользователь, который установит этот архив в корневой каталог системы (например, /usr
на Linux; тогда эта общая библиотека будет расположена автоматически) или вам придется написать небольшую оболочку сценария оболочки вокруг вашего исполняемого файла, которая найдет общую библиотеку и установит соответствующие LD_LIBRARY_PATH
,
Я бы пошел по первому пути. Обычно все основные платформы предоставляют средства для создания установочных пакетов (deb/rpm/pkg.tar.xz/ что угодно в Linux, brew на Mac, установщик Windows в Windows, хотя в Windows вы можете просто поместить свою общую библиотеку в тот же каталог, что и исполняемый файл и он будет работать). Вам просто нужно создать пакеты для платформы, на которой работают ваши пользователи, так что ваша программа будет установлена в правильные каталоги, а ваша общая библиотека будет решена автоматически.