无法在 R 包中加载具有继承 class 的共享对象
Unable to load shared object with inherited class in a R package
我正在使用 Rcpp 创建一个 R 包。在这个包中,我想创建不会导出到 R 的 classes,其中 class 继承自另一个。
我用 Rcpp.package.skeleton() 创建了一个包,我在 src
目录中添加了两个文件。
我有一个文件A.h:
class A {
public:
virtual ~A();
};
class B : public A {
public:
B();
};
还有一个文件A.cpp:
#include "A.h"
B::B() { }
编译包时,出现以下错误:
Error in dyn.load(dllfile) :
unable to load shared object '.../test/src/test.so':
.../test/src/test.so: undefined symbol: _ZTI1A
我只找到有关将此类 class 暴露给 R 的资源,但我想知道是否可以在内部使用此类 class,而不将其暴露给 R?
编辑:如果我理解正确,构建包所需的文件是:
命名空间:
useDynLib(test, .registration=TRUE)
exportPattern("^[[:alpha:]]+")
importFrom(Rcpp, evalCpp)
描述:
Package: test
Type: Package
Title: What the Package Does in One 'Title Case' Line
Version: 1.0
Date: 2020-06-23
Author: Your Name
Maintainer: Your Name <your@email.com>
Description: One paragraph description of what the package does as one
or more full sentences.
License: GPL (>= 2)
Imports: Rcpp (>= 1.0.4)
LinkingTo: Rcpp
RoxygenNote: 7.1.0
这与Rcpp无关。你的 class A
简直是“太虚”了。如果我将您的文件 A.h
和 A.cpp
与这种形式的简单 main.cpp
结合起来
#include <cstdio>
int main(int argc, char *argv[]) {
std::printf("Hello, world.");
}
并尝试编译它我也得到一个错误:
edd@rob:/tmp$ g++ -o A A.cpp main.cpp
/usr/bin/ld: /tmp/ccbuZv0r.o: in function `A::A()':
A.cpp:(.text._ZN1AC2Ev[_ZN1AC5Ev]+0xf): undefined reference to `vtable for A'
/usr/bin/ld: /tmp/ccbuZv0r.o: in function `B::~B()':
A.cpp:(.text._ZN1BD2Ev[_ZN1BD5Ev]+0x26): undefined reference to `A::~A()'
/usr/bin/ld: /tmp/ccbuZv0r.o:(.data.rel.ro._ZTI1B[_ZTI1B]+0x10): undefined reference to `typeinfo for A'
collect2: error: ld returned 1 exit status
edd@rob:/tmp$
这几乎也是您从 R 中得到的
edd@rob:/tmp$ c++filt _ZTI1A
typeinfo for A
edd@rob:/tmp$
所以您的包裹根本不够用 -- 与 Rcpp 无关。
我正在使用 Rcpp 创建一个 R 包。在这个包中,我想创建不会导出到 R 的 classes,其中 class 继承自另一个。
我用 Rcpp.package.skeleton() 创建了一个包,我在 src
目录中添加了两个文件。
我有一个文件A.h:
class A {
public:
virtual ~A();
};
class B : public A {
public:
B();
};
还有一个文件A.cpp:
#include "A.h"
B::B() { }
编译包时,出现以下错误:
Error in dyn.load(dllfile) :
unable to load shared object '.../test/src/test.so':
.../test/src/test.so: undefined symbol: _ZTI1A
我只找到有关将此类 class 暴露给 R 的资源,但我想知道是否可以在内部使用此类 class,而不将其暴露给 R?
编辑:如果我理解正确,构建包所需的文件是:
命名空间:
useDynLib(test, .registration=TRUE)
exportPattern("^[[:alpha:]]+")
importFrom(Rcpp, evalCpp)
描述:
Package: test
Type: Package
Title: What the Package Does in One 'Title Case' Line
Version: 1.0
Date: 2020-06-23
Author: Your Name
Maintainer: Your Name <your@email.com>
Description: One paragraph description of what the package does as one
or more full sentences.
License: GPL (>= 2)
Imports: Rcpp (>= 1.0.4)
LinkingTo: Rcpp
RoxygenNote: 7.1.0
这与Rcpp无关。你的 class A
简直是“太虚”了。如果我将您的文件 A.h
和 A.cpp
与这种形式的简单 main.cpp
结合起来
#include <cstdio>
int main(int argc, char *argv[]) {
std::printf("Hello, world.");
}
并尝试编译它我也得到一个错误:
edd@rob:/tmp$ g++ -o A A.cpp main.cpp
/usr/bin/ld: /tmp/ccbuZv0r.o: in function `A::A()':
A.cpp:(.text._ZN1AC2Ev[_ZN1AC5Ev]+0xf): undefined reference to `vtable for A'
/usr/bin/ld: /tmp/ccbuZv0r.o: in function `B::~B()':
A.cpp:(.text._ZN1BD2Ev[_ZN1BD5Ev]+0x26): undefined reference to `A::~A()'
/usr/bin/ld: /tmp/ccbuZv0r.o:(.data.rel.ro._ZTI1B[_ZTI1B]+0x10): undefined reference to `typeinfo for A'
collect2: error: ld returned 1 exit status
edd@rob:/tmp$
这几乎也是您从 R 中得到的
edd@rob:/tmp$ c++filt _ZTI1A
typeinfo for A
edd@rob:/tmp$
所以您的包裹根本不够用 -- 与 Rcpp 无关。