C++ 在Rcpp包中加载共享对象

C++ 在Rcpp包中加载共享对象,c++,r,gcc,rcpp,rcpp11,C++,R,Gcc,Rcpp,Rcpp11,我想将/libdynamic/dynamic.h包含到带有Rcpp的包中。目录libdynamic嵌套在项目的文件夹src中。 当我试图构建一个R包时,我面临dyn.load错误。 Error in dyn.load(file, DLLpath = DLLpath, ...) : unable to load shared object 来源结构。 我使用Rcpp.h和R.h在Eclipse中成功编译: R CMD检查 Makevars: PKG_CPPFLAGS+=-I../

我想将
/libdynamic/dynamic.h
包含到带有
Rcpp
的包中。目录
libdynamic
嵌套在项目的文件夹
src
中。 当我试图构建一个R包时,我面临
dyn.load
错误。

Error in dyn.load(file, DLLpath = DLLpath, ...) : 
      unable to load shared object
来源结构。 我使用
Rcpp.h
R.h
Eclipse
中成功编译:
R CMD检查
Makevars

PKG_CPPFLAGS+=-I../src/libdynamic -std=c++0x
问题: 看起来当R构建包时,它不会链接以前编译过的东西。
如何强制R编译嵌套文件夹中的所有内容并将其链接?

正如@dirk eddelbuettel所述:

将所有文件保存在
src
中,一切都会自动运行


查看
src/
中包含子目录的现有包,看看它们是如何实现的。两者都有相似的设置。我已经在
Makevars
中对includes
-I
做了同样的操作。我们唯一的区别是我包含了
.h
文件,无论它们是否包含
.hpp
。这是原因吗?我认为你完全低估了自己的意图。看看包装矩阵;您还需要指示R在子目录中编译。(您提到的Eclipse毫无意义;Eclipse不是编译器;R不使用CMake。)但您不能指望我一对一地教您。研究现有的例子。这是可以做到的。否则,将所有内容复制到
src/
并结束。值得一提的是,我认为您引用的两个示例都不适用,因为它们似乎只是标题,不涉及编译。这是让你绊倒的棘手的一点。是你强加了复杂性。将所有文件保存在
src
中,一切都会自动运行。
gcc -O0 -g3 -Wall -c -fmessage-length=0 -o libdynamic/dynamic/string.o ../libdynamic/dynamic/string.c 
gcc -O0 -g3 -Wall -c -fmessage-length=0 -o libdynamic/dynamic/cfarmhash.o ../libdynamic/dynamic/cfarmhash.c 
gcc -O0 -g3 -Wall -c -fmessage-length=0 -o libdynamic/dynamic/mapi.o ../libdynamic/dynamic/mapi.c 
../libdynamic/dynamic/mapi.c: In function ‘mapi_rehash’:
../libdynamic/dynamic/mapi.c:212:7: warning: implicit declaration of function ‘aligned_alloc’ [-Wimplicit-function-declaration]
       nm.objects = (char *) aligned_alloc(64, MAPI_ROUNDUP(c * nm.object_size, 64));
       ^
../libdynamic/dynamic/mapi.c:212:20: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
       nm.objects = (char *) aligned_alloc(64, MAPI_ROUNDUP(c * nm.object_size, 64));
                    ^
gcc -O0 -g3 -Wall -c -fmessage-length=0 -o libdynamic/dynamic/maps.o ../libdynamic/dynamic/maps.c 
g++ -D__cplusplus=201103L -I/home/cracs/workspace/R-ulib-wrapper/libdynamic -I/usr/local/lib/R/site-library/Rcpp/include -I/usr/share/R/include -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -o structs.o ../structs.cpp 
g++ -D__cplusplus=201103L -I/home/cracs/workspace/R-ulib-wrapper/libdynamic -I/usr/local/lib/R/site-library/Rcpp/include -I/usr/share/R/include -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -o main.o ../main.cpp 
g++ -D__cplusplus=201103L -I/home/cracs/workspace/R-ulib-wrapper/libdynamic -I/usr/local/lib/R/site-library/Rcpp/include -I/usr/share/R/include -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -o Rulib.o ../Rulib.cpp 
gcc -O0 -g3 -Wall -c -fmessage-length=0 -o libdynamic/dynamic/vector.o ../libdynamic/dynamic/vector.c 
g++ -D__cplusplus=201103L -I/home/cracs/workspace/R-ulib-wrapper/libdynamic -I/usr/local/lib/R/site-library/Rcpp/include -I/usr/share/R/include -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -o RcppExports.o ../RcppExports.cpp 
gcc -O0 -g3 -Wall -c -fmessage-length=0 -o libdynamic/dynamic/buffer.o ../libdynamic/dynamic/buffer.c 
g++ -L/usr/local/lib/R/site-library/Rcpp/libs -L/usr/lib/R/lib -o R-ulib-wrapper structs.o main.o libdynamic/dynamic/vector.o libdynamic/dynamic/string.o libdynamic/dynamic/maps.o libdynamic/dynamic/mapi.o libdynamic/dynamic/cfarmhash.o libdynamic/dynamic/buffer.o Rulib.o RcppExports.o -lR 
* installing *source* package ‘Rulib’ ...
** libs
g++ -I/usr/share/R/include -DNDEBUG -I/usr/local/lib/R/site-library/Rcpp/include -I../src/libdynamic -std=c++0x  -I"/usr/local/lib/R/site-library/Rcpp/include"   -fpic  -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -c RcppExports.cpp -o RcppExports.o
g++ -I/usr/share/R/include -DNDEBUG -I/usr/local/lib/R/site-library/Rcpp/include -I../src/libdynamic -std=c++0x  -I"/usr/local/lib/R/site-library/Rcpp/include"   -fpic  -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -c Rulib.cpp -o Rulib.o
g++ -I/usr/share/R/include -DNDEBUG -I/usr/local/lib/R/site-library/Rcpp/include -I../src/libdynamic -std=c++0x  -I"/usr/local/lib/R/site-library/Rcpp/include"   -fpic  -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -c main.cpp -o main.o
g++ -I/usr/share/R/include -DNDEBUG -I/usr/local/lib/R/site-library/Rcpp/include -I../src/libdynamic -std=c++0x  -I"/usr/local/lib/R/site-library/Rcpp/include"   -fpic  -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -c structs.cpp -o structs.o
g++ -shared -Wl,-Bsymbolic-functions -Wl,-z,relro -o Rulib.so RcppExports.o Rulib.o main.o structs.o -L/usr/lib/R/lib -lR
installing to /home/cracs/src/Rulib.Rcheck/Rulib/libs
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
Error in dyn.load(file, DLLpath = DLLpath, ...) : 
  unable to load shared object '/home/cracs/src/Rulib.Rcheck/Rulib/libs/Rulib.so':
  /home/cracs/src/Rulib.Rcheck/Rulib/libs/Rulib.so: undefined symbol: maps_begin
Error: loading failed
Execution halted
ERROR: loading failed
* removing ‘/home/cracs/src/Rulib.Rcheck/Rulib’
PKG_CPPFLAGS+=-I../src/libdynamic -std=c++0x