Как правильно использовать useDynLib() в файле пространства имен R-пакета

Хотя в Интернете существует несколько решений, я не нашел ни одного из тех, которые подходят для проблемы, с которой я сверкаю (хотя, может быть, я просто слишком тупой):

Я пытаюсь создать R-пакет, который широко использует общий объект, скомпилированный с помощью Makefile (да, плохая практика, я знаю, но файл Makevars просто не может быть использован для компиляции кода C и Fortran в один общий объект) из кода в каталоге src. Независимо от того, где я компилирую это .so(я попробовал src, libs и базовые папки пакета) или как я его назвал (поскольку одно из упомянутых выше решений указывает, что оно должно быть названо как пакет, в котором он содержится), R CMD check завершается с помощью

** testing if installed package can be loaded
Error in library.dynam(lib, package, package.lib) : 
shared object ‘SoMNibEN.R.so’ not found

из-за инструкции useDynLib(SoMNibEN.R) в моем файле NAMESPACE (где SoMNibEN.R - это имя моего пакета, но оно также не работает с исходным именем)

Мое предположение заключается в том, что я либо неправильно использую эту команду useDynLib(), либо я делаю что-то не так с моим Makefile (хотя компиляция работает очень хорошо, а общий объект создается в моей папке проекта - я просто не знаю, t знает, успешно ли он скопирован в каталог установки пакета.)

Итак, если кто-то знает, что я могу делать неправильно здесь, пожалуйста, дайте мне знать!

Ответ 1

Вы хотите, чтобы имя пакета было как аргумент, так как это имя общего объекта, построенного R, например useDynLib("chron"). Кавычки являются необязательными (как для library() и т.д.).

Я также рекомендую не использовать Makefile, а просто отбрасывать файлы C и Fortran в каталоге src/. R обычно достаточно умен, чтобы знать, что делать. Если вам нужны ключи -I etc, вы можете установить их там.

Наконец, используйте CRAN. Есть сотни пакетов с скомпилированными источниками, и некоторые из них должны быть похожи по своему составу на ваш вопрос.