Rcpp 包创建符号未找到错误
Rcpp package creation Symbol not found error
我正在尝试使用 Rcpp 创建一个 R 包。
我想导出的主要代码是C++的,但它依赖于其他C++和C脚本。
我的项目看起来像这样:
├── DESCRIPTION
├── NAMESPACE
├── R
│ └── RcppExports.R
├── README.md
├── Read-and-delete-me
├── inst
│ ├── include
│ │ ├── Generate_RQMC.hpp
│ │ ├── Get_seed.hpp
│ │ ├── HilbertCode.hpp
│ │ └── SamplePack
│ │ ├── DB_NX.h
│ │ ├── DB_ShiftNets.h
│ │ ├── DigitalNetsBase2.h
│ │ ├── Measurements.h
│ │ └── RadicalInversesBase2.h
│ └── libsqmc_main.a
├── man
│ └── RSQMC-package.Rd
└── src
├── Makevars
├── RSQMC.so
├── RcppExports.cpp
├── RcppExports.o
├── SQMC.cpp
├── SQMC.o
└── libqmc
├── Generate_RQMC.cpp
├── Generate_RQMC.o
├── Get_seed.cpp
├── Get_seed.o
├── HilbertCode.cpp
├── HilbertCode.o
└── SamplePack
├── DigitalNetsBase2.C
├── Measurements.C
├── dn2dpro.C
├── dnmeasure.C
├── ricapdisc.C
├── rimeasure.C
├── rivis.C
└── tparam.C
其中libsqmc.so是共享库,将文件夹R_Functions中的所有脚本分组。
在主.cpp文件中,我想从 Generate_RQMC.hpp 调用一个函数,所以我在脚本的开头添加了以下行:
#include "SQMC_scripts/R_Functions/include/Generate_RQMC.hpp"
当我跑步时
R CMD build RSQMC
我收到以下错误:
dyn.load(file, DLLpath = DLLpath, ...( 中的错误: 无法加载共享对象 '/private/var/folder/37/vpwyrl2j2bxdj91kh9fktzk00000gn/T/RtmpybFnDv/Rinst2f1e7114fbd2/RSQMC/libs/RSQMC.so': dlopen(/private/var/folder/37/vpwyrl2j2bxdj91kh9fktzk00000gn/T/RtmpybFnDv/Rinst2f1e7114fbd2/RSQMC/libs/RSQMC.so, 6(: 找不到符号: __Z16MyFunctioniii 引用自:/private/var/folder/37/vpwyrl2j2bxdj91kh9fktzk00000gn/T/RtmpybFnDv/Rinst2f1e7114fbd2/RSQMC/libs/RSQMC.so 预期:平面命名空间 in/private/var/folder/37/vpwyrl2j2bxdj91kh9fktzk00000gn/T/RtmpybFnDv/Rinst2f1e7114fbd2/RSQMC/libs/RSQMC.so 错误:加载失败 执行已停止 错误:加载失败 * 删除 '/private/var/folder/37/vpwyrl2j2bxdj91kh9fktzk00000gn/T/RtmpybFnDv/Rinst2f1e7114fbd2/RSQMC'
MyFunction是我尝试从Generate_RQMC.hpp在主文件中调用的函数。
我修改了 Makevars 添加 -I".../src/SQMC_scripts/include" 到 PKG_LIBS 但它没有改变任何东西。
我使用的是macOS Sierra 10.12.5,R 3.3.2和Rcpp 0.12.11。
更新
我修改了我的Makevars,现在看起来像这样:
CXX_STD = CXX11
SOURCES=$(wildcard SQMC_scripts/*.cpp SQMC_scripts/*/*.C)
OBJECTS = SQMC.o RcppExports.o $(SOURCES:.cpp=.o)
PKG_CXXFLAGS = -I".../RSQMC/src/"
PKG_LIBS = $(SHLIB_OPENMP_CFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
all: $(SHLIB)
$(OBJECTS): clean
clean: @rm -f $(OBJECTS)
但是我仍然有相同类型的错误(对于SQMC_scripts文件夹中定义的不同类和函数(,例如:
未找到符号:__ZN19DigitalNetGeneratorC1E4_dgtj
DigitalNetGenerator是在C文件DigitalNetsBase2中定义的一个类。
更新 2
由于无外套的答案和这个存储库,我终于设法让它工作。
这是我的 Makevars 文件,如果它可以对其他人有任何帮助:
$(info The compilation root directory is: $(ROOT_DIR))
$(info The name of the shared library to be created is: $(SHLIB))
CXX_STD = CXX11
PKG_CPPFLAGS= -Dlibqmc_core_shared_EXPORTS -I../inst -I../inst/include
PKG_LIBS= -L../inst -lsqmc_main -lgsl -lCGAL -lgslcblas
LIBS= -L./ -L../inst
SOURCES_C = ./libqmc/SamplePack/DigitalNetsBase2.C ./libqmc/SamplePack/dn2dpro.C ./libqmc/SamplePack/dnmeasure.C ./libqmc/SamplePack/Measurements.C ./libqmc/SamplePack/ricapdisc.C ./libqmc/SamplePack/rimeasure.C ./libqmc/SamplePack/rivis.C ./libqmc/SamplePack/tparam.C
SOURCES_CPP= ./libqmc/Generate_RQMC.cpp ./libqmc/Get_seed.cpp ./libqmc/HilbertCode.cpp
OBJECTS = SQMC.o RcppExports.o $(SOURCES_CPP:.cpp=.o) $(SOURCES_C:.c=.o)
#all: $(SHLIB)
all: $(SHLIB) ../inst/libsqmc_main.a
$(SHLIB): $(OBJECTS) ../inst/libsqmc_main.a
../inst/libsqmc_main.a: $(OBJECTS)
ar -rvs ../inst/libsqmc_main.a $(OBJECTS)
包子目录是第 1.1.5 节:编写 R 扩展中的包子目录中介绍的一个有趣的主题。不幸的是,它遗漏了一点。所以,这个问题出现了一点...事实上,我有一个类似的变体,因为它与子文件夹中的 Rcpp 属性使用有关。(剧透:不能在src/
子文件夹中使用属性...
遗憾的是,对src
目录中的文件夹执行此操作的唯一方法是修改Makevars
文件,如第 1.2.1 节:在编写 R 扩展时使用 Makevars 的后半部分所示。
因此,大致如下:
SOURCES=$(wildcard subfolder/*.cpp subfolder2/*.cpp)
OBJECTS = toplevelsrcfile.o RcppExports.o $(SOURCES:.cpp=.o)
PKG_CPPFLAGS=-I.
all: $(SHLIB)
clean:
@rm -f $(OBJECTS)
应该工作...
请注意,在您的情况下,toplevelsrcfile.o
应该是SQMC.o
.
不知道为什么symbols.rds
在src/
...
您需要首先放入src/
的子目录并编译包含的代码,可能到静态库(或只是一堆.o
文件(中,然后您可以从src/Makevars
引用。
有一些软件包可以做到这一点,但我想不出一个伟大的或规范的参考。我倾向于更喜欢外部库。
作为替代方案,您可以将所有C++文件放入src/
,R 将采用构建。 您可能需要调整文件中#include
路径。
- 在C++中使用内联方法时出现未定义的符号错误
- 我收到错误LNK2001:未解析的外部符号(C++代码)
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 错误:当我从"WinDbg"打开可执行文件时,找不到符号文件。默认导出 ntdll 的符号.dll
- 可视抽象类 c++(错误 LNK 2001:未解析的外部符号)
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 添加符号 libgtest.so 错误:命令行中缺少 DSO
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- 当 lib 已添加到其他依赖项时,如何在 VS 中调试未解析的外部符号错误
- 体系结构x86_64的未定义符号:链接器错误
- 错误LNK2019未解析的外部符号"public: __thiscall SLinkList<char>::SLinkList<char>(void)"
- 引入参数化构造函数后显示 LNK 2019 未解析外部符号的代码错误
- 与Qt交叉编译到Raspberry Pi 3B+通讯录(协议缓冲区)-错误符号查找错误
- 链接错误:符号重复
- 架构X86_64静态类成员的错误符号X86_64错误
- 缓冲区中使用 GetWindowText 的错误符号
- OSX:ld:警告:错误符号操作:适用于核心库
- 为什么 Folly 的共享库引用了 Boost 中的错误符号?(OS X 上的 GCC)
- 嵌入lua运行时错误:符号未找到:_luaL_newstate
- C++ 找不到"::"架构的苹果马赫-O链接器错误/符号