Hello, first of all: Thanks for creating Rcpp. It is great in interconnecting R and C++.
I am currently working on a project written in C++ using the Boost library and Bjam as build system. C++ code is called from R using Rcpp. The RCPP_MODULE directive is used to export some classes. Development is taking place on GNU/Linux but the program should run on Win, too. Therefore I created a cross-compilation chain using MinGW and Wine. At the moment only 32-bit DLLs are generated. When creating the shared object for GNU/Linux everything works fine. Also the cross-compilation chain works; random Win 32-bit binaries are created successfully. The cross-compilation chain consists of: - Ubuntu 11.10 - Wine 1.3.28 - MinGW with g++ in version 4.6.1 - Boost 1.51 - ⦠- Rcpp in version 10.1 (also used older versions e. g. 0.9.15) The Problem: When compiling the DLL no symbols related to the module are exported. After some investigation I figured out __declspec(dllexport) is missing, to mark the functions to be packed into the DLL. When loading the R package containing the Rcpp modules this results in the error message (<name> and <pkgname> are two strings I replaced): Error in Module(module, mustStart = TRUE) : Failed to initialize module pointer: Error in FUN("_rcpp_module_boot_<name>"[[1L]], ...): no such symbol _rcpp_module_boot_<name> in package Z:/home/user/opt/R/library/<pkgname>/libs/i386/<name>.dll The Fix: Add LibExtern to the Module's boot function. A patch is attached. I still wonder if I made any mistake or if this problem does not occur using Cygwin to compile on Win directly. Best regards Volker
>From ce4f7c1347cbd776b5d76858251dc3f2a87e7715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Volker=20Stei=C3=9F?= <volker.ste...@mni.thm.de> Date: Thu, 20 Dec 2012 11:51:06 +0100 Subject: [PATCH] Export boot function for Module when compiling for WIN32. To: rcpp-devel@lists.r-forge.r-project.org - Using LibExport definition of R to export boot function _rcpp_module_boot_* to add __declspec(dllexport) for modules when compiling for WIN32 but not in CYGWIN. --- inst/include/Rcpp/Module.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inst/include/Rcpp/Module.h b/inst/include/Rcpp/Module.h index ed922ce..904729b 100644 --- a/inst/include/Rcpp/Module.h +++ b/inst/include/Rcpp/Module.h @@ -396,7 +396,7 @@ namespace Rcpp{ #define RCPP_MODULE(name) \ void _rcpp_module_##name##_init() ; \ static Rcpp::Module _rcpp_module_##name( # name ) ; \ - extern "C" SEXP _rcpp_module_boot_##name(){ \ + extern "C" LibExport SEXP _rcpp_module_boot_##name(){ \ ::setCurrentScope( & _rcpp_module_##name ) ; \ _rcpp_module_##name##_init( ) ; \ Rcpp::XPtr<Rcpp::Module> mod_xp(& _rcpp_module_##name , false); \ -- 1.7.9.5
_______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel