Werner,
Extension .C is for C++ code, not C code. Please use the extension .c.
The problem is C++ name mangling.
Brian
On Tue, 28 Mar 2006, Werner Stuetzle wrote:
>
> I am trying to compile a C function and make a dll using MinGW. I
> installed MinGW, Perl, the Murdoch-Sutherland tool collection, and then I
> proceed as in "R for Windows FAQ" Section 8.
>
> Here is my C function:
> ----------------------------------------------------------------------
> /* C function adding two vectors (5-26-05) */
>
> #include<stdlib.h>
>
> EXPORT void addvectors(double *a, double *b, int *n, double *sum) {
> int i;
> for (i = 0; i < *n; i++) {
> sum[i] = a[i] + b[i];
> }
> }
> ----------------------------------------------------------------------
>
> Here is my command to make the dll and the output:
>
> ----------------------------------------------------------------------
> z:/Stat534/Spring06/Website/Link-C-R $ c:/Progra~1/R/R-2.2.1/bin/R CMD
> SHLIB add-vectors.C
> making add-vectors.d from add-vectors.C
> g++ -Ic:/Progra~1/R/R-2.2.1/include -Wall -O2 -c add-vectors.C -o
> add-vectors.o
> ar cr add-vectors.a add-vectors.o
> ranlib add-vectors.a
> g++ --shared -s -o add-vectors.dll add-vectors.def add-vectors.a
> -Lc:/Progra~1/R/R-2.2.1/src/gnuwin32 -lg2c -lR
> ----------------------------------------------------------------------
>
> I get "add-vectors.dll". Here is the R code to load the dll and
add two
> vectors:
>
> ----------------------------------------------------------------------
> dll.filename <-
> "z:\\Stat534\\Spring06\\Website\\Link-C-R\\add-vectors.dll"
>
> dyn.load(dll.filename)
>
> ## If the DLL needs to be re-built, it has to be unloaded first.
> ## dyn.unload(dll.filename)
>
>
> addvectors <- function(a, b) {
> the.sum <- rep(0, length(a))
> res <- .C("addvectors", as.double(a), as.double(b),
as.integer(length(a)),
> as.double(the.sum))
> return(res[[4]])
> }
>
> a <- c(1,2,3)
> b <- c(4,5,6)
> addvectors(a, b)
> ----------------------------------------------------------------------
>
> Here is what I get when I use addvectors:
>
> ----------------------------------------------------------------------
>> addvectors(a, b)
> Error in .C("addvectors", as.double(a), as.double(b),
as.integer(length(a)), :
> C entry point "addvectors" not in load table
> ----------------------------------------------------------------------
>
>
> What am I doing wrong?
>
> Thanks a lot, W
>
>
> ----------------------------------------------------------------------
> Werner Stuetzle (206) 685-7431 (w)
> Professor, Statistics (206) 685-7419 (fax)
> Adjunct Professor, CSE wxs at stat.washington.edu
> Director, ACMS www.stat.washington.edu/wxs
> Department of Statistics, Box 354322 Office: Padelford B305
> University of Washington
> Seattle, WA 98195-4322
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide!
http://www.R-project.org/posting-guide.html
>
--
Brian D. Ripley, ripley at stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UK Fax: +44 1865 272595