| Writing packages for R | |
| ====================== | |
| See the Writing R Extensions manual for a full description of how | |
| to write a package. | |
| Building from a source-code library under Windows | |
| ================================================= | |
| Instructions for installing the toolset and building packages using the | |
| standard methods are in the `R Installation and Administration' manual | |
| (which is available in various formats as R-admin.* in the doc/manual | |
| directory). | |
| This file contains instructions for non-standard situations: | |
| - Using Microsoft Visual C++ | |
| - Using Borland C++ | |
| - Using other compilers and languages | |
| All the examples given here have worked at some point with 32-bit R, | |
| but are mainly of historical interest. | |
| Using Visual C++ | |
| ================ | |
| You may if you prefer use Visual C++ to make the DLLs (unless they use | |
| Fortran source!). The notes here were tested with VC++6. | |
| First build the import library Rdll.lib by (from the sources) | |
| make R.exp | |
| lib /def:R.exp /out:Rdll.lib | |
| or, depending on your version of VC++ | |
| link /lib /def:R.exp /machine:x86 /out:Rdll.lib | |
| Another way to make R.exp is to use pexports.exe from mingw-utils, | |
| e.g. pexports R.dll > R.exp. | |
| Then you can compile the objects and build the DLL by | |
| cl /MT /Ox /D "WIN32" /c *.c | |
| link /dll /def:mypkg.def /out:mypkg.dll *.obj Rdll.lib | |
| where you will need to create the .def file by hand listing the entry | |
| points to be exported. (If there are just a few you can use /export | |
| flags instead.) If the C sources use R header files you will need to | |
| arrange for these to be searched, perhaps by including in the cl line | |
| /I ..\..\..\include | |
| If you build a debug version of the DLL in the development | |
| environment, you can debug the DLL code there just by setting the | |
| executable to be debugged as the full path to the R front-end. | |
| Extra care is needed when referencing variables (rather than | |
| functions) exported from R.dll. These must be declared | |
| __declspec(dllimport) (as in R's own header files). | |
| For some applications making use of the R API headers you will need to | |
| build import libraries for Rblas.dll or graphapp.dll and link against | |
| those. | |
| VC++6 lacks some standard functions such as isnan and isfinite. To use | |
| R's macros you will need | |
| #undef ISNAN | |
| #define ISNAN(x) _isnan(x) | |
| #undef R_FINITE | |
| #define R_FINITE(x) _finite(x) | |
| for example. Even then, we have seen examples of IEC60559 arithmetic | |
| being performed incorrectly. | |
| Using Borland C++ | |
| ================= | |
| Borland C++5.5 is available as a free download from | |
| http://www.borland.com/bcppbuilder/freecompiler/ and as part of C++ | |
| Builder 5. The following will make convolve.dll from convolve.c (flag | |
| -6 optimizes for a Pentium Pro/II/III/4, and -u- removes extra underscores) | |
| bcc32 -u- -6 -O2 -WDE convolve.c | |
| You can build an import library for R.dll by | |
| make R.exp | |
| implib R.lib R.exp | |
| and then add R.lib to the bcc32 command line, for example (from | |
| Venables & Ripley's `S Programming') | |
| bcc32 -u- -6 -O2 -WDE -I\R\R-2.3.0\src\include VCrndR.c R.lib | |
| We believe that when referencing variables (rather than functions) | |
| exported from R.dll these must be declared __declspec(dllimport) just | |
| as for VC++. | |
| Using other compilers and languages | |
| =================================== | |
| To use C++ see the section in the R for Windows FAQ. You can include | |
| C++ code in packages and the supplied Makefiles will compile with g++ | |
| and link the DLL using g++ (and hence link against libstdc++). Use of | |
| C++ I/O may or may not work, and has been seen to crash R. | |
| To use F90 or F95, see `Writing R Extensions'. | |
| For other compilers you will need to arrange to produce a DLL with | |
| cdecl (also known as _cdecl or __cdecl) linkage. The MinGW port (and | |
| VC++) uses no `name mangling' at all, so that if for example your | |
| compiler adds leading or trailing underscores you will need to use the | |
| transformed symbol in the call to .C in your R code. Many compilers | |
| can produce cdecl DLLs by a suitable choice of flags, but if yours | |
| cannot you may need to write some `glue' code in C to interface to the | |
| DLL. | |
| If you use .Fortran this appends an underscore and does no case | |
| conversion at all to the symbol name. It is normally best to use .C | |
| with compilers other than gfortran and map the name manually if | |
| necessary. | |
| Care is needed in passing character strings to and from a DLL by .C: | |
| they must be equivalent to the C type char** and null-terminated. Not | |
| even the MinGW g77 Fortran used null-terminated strings. (g77 was in | |
| GCC 3.x.y, superseded by gfortran.) | |
| WARNING: DLLs made with some compilers reset the FPU in their startup | |
| code and this will cause operations such as | |
| 0./0. to crash R. You can re-set the FPU to the correct values by a | |
| call to the C entry point Rwin_fpset(). | |