模板继承:未找到符号

时间:2017-11-08 22:52:54

标签: c++ templates inheritance linker rcpp

我遇到模板问题&遗产。我已经将一些有问题的代码缩减到了我可以在这里发布的内容。我的代码如下:

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

这是正常的吗?

1 个答案:

答案 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() { }
};

链接错误消失(至少在我的复制中)。