Re: [Rd] Problems when linking to R shared library

From: Dirk Eddelbuettel <edd_at_debian.org>
Date: Thu, 31 May 2007 20:12:16 -0500

On 31 May 2007 at 19:04, John Maddock wrote:
| Folks,
|
| I'm fairly sure that I'm doing something stupid, but I'm getting a few
| really strange results from *some* of the distributions, but by no means
| all,
| when I link directly to the R shared library.

When I try to build your program, I get very immediate and explicit messages:

edd_at_basebud:~> g++ -Wall -O3 -I/usr/share/R/include -o /tmp/johnmaddock /tmp/johnmaddock.cc -lRmath /tmp/ccb5T7l9.o: In function `main':

johnmaddock.cc:(.text+0xae): undefined reference to `Rf_pf'
johnmaddock.cc:(.text+0xed): undefined reference to `Rf_pchisq'
johnmaddock.cc:(.text+0x136): undefined reference to `Rf_pgamma'
johnmaddock.cc:(.text+0x17a): undefined reference to `Rf_ppois'
johnmaddock.cc:(.text+0x1b9): undefined reference to `Rf_qchisq'
johnmaddock.cc:(.text+0x202): undefined reference to `Rf_qgamma'
collect2: ld returned 1 exit status

which shows that the compiler/linker do not yet know about the functions you use.

Your mistake was to not do

#define MATHLIB_STANDALONE 1

before the #include of Rmath.h. After that, all is well:

edd_at_basebud:~> g++ -Wall -O3 -I/usr/share/R/include -o /tmp/johnmaddock /tmp/johnmaddock.cc -lRmath edd_at_basebud:~> /tmp/johnmaddock

0.646447
0.527633
0.090204
0.124652
1.38629
5.03504
edd_at_basebud:~>                    

| I've tried this on both Windows with the precompiled Mingw binary of R-2.5.0
| (compiling my code with MinGW-3.4.2), and by building R-2.5.0 on Mandriva
| Linux with gcc-3.4.4 and --enable-R-shlib. The actual code is at the end of
| the message, but the main cases are:
|
| std::cout << pf(1.5, 2.0, 3.0, 1, 0) << std::endl;
|
| Outputs 1, expect 0.646447

Good.

| std::cout << pchisq(1.5, 2.0, 1, 0) << std::endl;
|
| Outputs 1, expect 0.527633

Good.  

| std::cout << pgamma(1.5, 2.0, 3.0, 1, 0) << std::endl;
|
| Outputs 1, expect 0.090204

Good.  

| std::cout << ppois(2.0, 5.0, 1, 0) << std::endl;
|
| Outputs 0, expect 0.124652

Good.    

| std::cout << qchisq(0.5, 2.0, 1, 0) << std::endl;
|
| Outputs -0.61379, expect 1.38629

Good.  

| std::cout << qgamma(0.5, 2.0, 3.0, 1, 0) << std::endl;
|
| Outputs 0.0282703, expect 5.03504

Good.  

| I should stress that within the R environment, I *do* get the values I
| expect: though sometimes the arguments need adjusting as the C functions
| have slightly different argument lists from the R versions.
|
| Also:
|
| std::cout << qpois(0.5, 5.0, 1, 0) << std::endl;
|
| Seems to go into an infinite loop inside qpois, while:
|
| qbeta(0.1, 1e-5, 1e-5, 1, 0);
|
| Raises an access violation inside R: although I should stress that all other
| beta quantiles I've tested come out OK.
|
| Anyway, hopefully you can just tell me what an idiot I am :-)

We are too polite for that, we also insist that folks do the old RTFM -- the #define you missed is of course mentioned in the R Extensions manual.

Hth, Dirk  

| Thanks in advance for any help you can give,
|
| John Maddock.
|
| The complete source code is:
|
| #include <iostream>
| #include <iomanip>
|
| extern "C" {
| #include "Rmath.h"
| }
|
| int main(int argc, const char** argv)
| {
| std::cout << pf(1.5, 2.0, 3.0, 1, 0) << std::endl;
| std::cout << pchisq(1.5, 2.0, 1, 0) << std::endl;
| std::cout << pgamma(1.5, 2.0, 3.0, 1, 0) << std::endl;
| std::cout << ppois(2.0, 5.0, 1, 0) << std::endl;
| std::cout << qchisq(0.5, 2.0, 1, 0) << std::endl;
| std::cout << qgamma(0.5, 2.0, 3.0, 1, 0) << std::endl;
| //std::cout << qpois(0.5, 5.0, 1, 0) << std::endl;
| return 0;
| }
|
| ______________________________________________
| R-devel_at_r-project.org mailing list
| https://stat.ethz.ch/mailman/listinfo/r-devel

-- 
Hell, there are no rules here - we're trying to accomplish something. 
                                                  -- Thomas A. Edison

______________________________________________
R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Fri 01 Jun 2007 - 01:15:19 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 01 Jun 2007 - 07:34:17 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.