2013-04-13 4 views
8

Я хочу, чтобы создать DLL динамическую библиотеку из исходного кода C, так что я могу загрузить и использовать его в R. Я теперь с помощьюСоздание динамической библиотеки DLL из C в R (Windows)

R CMD SHLIB foo.c 

в командной строке Windows 7. Но ничего не случилось. Нет сообщения об ошибке, но dll-файл не создан.

Что случилось с тем, что я сделал? Спасибо.

ответ

7

Прошу прощения, если мой вопрос не очень ясен. Но я понял, как заставить все работать и возможные ошибки. Надеюсь, это будет полезно для кого-то. Ниже приведены этапы:

  1. Установить R (последняя версия 3.0.0 сейчас). Обязательно добавьте папку R bin в PATH
  2. Установите последнюю версию Rtools Here. Не забудьте добавить «c: \ Rtools \ bin; c: \ Rtools \ gcc-4.6.3 \ bin;" в PATH
  3. Написать свой код C, сохраненный в foo.c
  4. В окне командной строки Windows, тип

    R CMD SHLIB foo.c

, то вы должны иметь foo.dll файл, то вы можете вызвать его в R. Обратите внимание, что foo.dll, созданный под 64 бит R, может быть загружен только в 64 бит R. Если вы попытаетесь загрузить в 32 бит R, вы получите сообщения об ошибках.

+0

Вы также можете попробовать: [TDM-GCC] (http://tdm-gcc.tdragon.net/), [Cygwin] (https://www.cygwin.com/), [msysGit] (https: //msysgit.github.io/) (только для netinstall), но Rtools работает лучше! – DenisKolodin

2

Точно, что вы подразумеваете под «ничего не случилось»? Является ли R на вашем пути?

Что делает R --version? Как насчет R CMD config CC и R CMD config CFLAGS?

Наконец, если вы Rcpp установили (и средства компиляции была правильной, включая настройки PATH и все остальное) вы могли бы сделать что-то на лету а-ля

R> library(Rcpp) 
R> cppFunction('double foo(double x) { return std::sqrt(x); }') 
R> foo(4) 
[1] 2 
R> foo(4.2) 
[1] 2.04939 
R> unclass(foo) 
function (x) 
.Primitive(".Call")(<pointer: 0x7f251ba76530>, x) 
R> 

Здесь мы использовали cppFunction() (и куча трюков внутри Rcpp), чтобы скомпилировать, связать и загрузить простую (и довольно бесполезную ...) функцию C (++), которая принимает квадратный корень.

Смежные вопросы