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: [EMAIL PROTECTED]:~> 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: [EMAIL PROTECTED]:~> g++ -Wall -O3 -I/usr/share/R/include -o /tmp/johnmaddock /tmp/johnmaddock.cc -lRmath [EMAIL PROTECTED]:~> /tmp/johnmaddock 0.646447 0.527633 0.090204 0.124652 1.38629 5.03504 [EMAIL PROTECTED]:~> | 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@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@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel