我遇到模板问题&遗产。我已经将一些有问题的代码缩减到了我可以在这里发布的内容。我的代码如下:
create function Arraysort(anyarray,integer)
(
select case
when d=0 then
(
DECLARE
swapped BOOLEAN;
tmp VARCHAR2(10);
BEGIN
LOOP
swapped := false;
FOR i IN 1 .. $1.LAST
LOOP
IF $1[i-1] > $1[i]
THEN
tmp := $1[i];
$1[i] := $1[i-1];
$1[i-1] := tmp;
swapped := true;
END IF;
END LOOP;
EXIT WHEN NOT swapped;
END LOOP;
)
)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>500 Internal Server Error</title>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.</p>
虽然以上都是纯粹的C ++&#34;代码,我在///////////////////////////// My header.h file
#include <vector>
template <class T>
class Slider {
protected:
std::vector<T> out;
public:
Slider() : out() {}
virtual void save_result();
};
template <class T>
class SlidingVar : public Slider<T> {
public:
SlidingVar() {}
void save_result() {}
};
template <class T>
void slide(std::vector<T> x, Slider<T> s) {}
///////////////////////////// My sliding_sd.cpp file
#include <vector>
#include "headers.h"
void sliding_var_window(std::vector<double> x) {
SlidingVar<double> s;
slide(x, s);
}
包的上下文中执行此操作,我的R
函数将被导出为可从R调用。
上面的编译没问题,但是当R使用sliding_var_window
加载它时,我得到dlopen
函数的Symbol not found
错误。奇怪的是,在我削减它之前,其他类似的功能工作得很好,但不是这个。这是构建序列:
save_result()
我怀疑这与==> R CMD INSTALL --preclean --no-multiarch --with-keep.source tsevents
* installing to library ‘/Users/kwilliams/R/library/3.4’
* installing *source* package ‘TSEvents’ ...
** libs
clang++ -std=gnu++11 -I/usr/local/Cellar/r/3.4.2/lib/R/include -DNDEBUG -I"/Users/kwilliams/R/library/3.4/Rcpp/include" -I/usr/local/opt/gettext/include -I/usr/local/opt/readline/include -I/usr/local/include -fPIC -g -O2 -c sliding_sd.cpp -o sliding_sd.o
clang++ -std=gnu++11 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/local/opt/gettext/lib -L/usr/local/opt/readline/lib -L/usr/local/lib -L/usr/local/Cellar/r/3.4.2/lib/R/lib -L/usr/local/opt/gettext/lib -L/usr/local/opt/readline/lib -L/usr/local/lib -o TSEvents.so sliding_sd.o -L/usr/local/Cellar/r/3.4.2/lib/R/lib -lR -lintl -Wl,-framework -Wl,CoreFoundation
installing to /Users/kwilliams/R/library/3.4/TSEvents/libs
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
Error: package or namespace load failed for ‘TSEvents’ in dyn.load(file, DLLpath = DLLpath, ...):
unable to load shared object '/Users/kwilliams/R/library/3.4/TSEvents/libs/TSEvents.so':
dlopen(/Users/kwilliams/R/library/3.4/TSEvents/libs/TSEvents.so, 6): Symbol not found: __ZN6SliderIdE11save_resultEv
Referenced from: /Users/kwilliams/R/library/3.4/TSEvents/libs/TSEvents.so
Expected in: flat namespace
in /Users/kwilliams/R/library/3.4/TSEvents/libs/TSEvents.so
Error: loading failed
或R
无关,但是它提供了我的构建环境,所以如果有人可以提出一种方法来在纯C ++中演示这个问题工具链,非常受欢迎。
我不明白的另一个小问题 - 当我查看目标文件中定义的符号时,Rcpp
函数似乎具有save_result()
返回类型,当我声明它是unsigned short
:
void
这是正常的吗?
答案 0 :(得分:1)
我可以在添加int main() { }
并使用g++
进行编译后重现链接器错误,而无需其他选项:
sliding_sd.cpp:(.rdata$_ZTV6SliderIdE[__ZTV6SliderIdE]+0x8): undefined reference to `Slider<double>::save_result()'
这意味着对Slider<double>::save_result()
的vtable(虚拟方法表)中的虚拟方法Slider<double>
的引用在链接期间无法解析。原因是您在save_result()
中声明了template <class T> class Slider
但未定义它(至少在您发布的代码中)。尽管在您的示例中从不使用Slider<double>::save_result()
,但必须定义它(至少在使用普通C ++时,我不知道R),因为它是virtual
。否则,在链接期间无法创建Slider<double>
的vtable。
更改为
时template <class T>
class Slider {
/* ... */
virtual void save_result() { }
};
链接错误消失(至少在我的复制中)。