テンプレートに問題があります&継承。問題のあるコードを私がここに投稿できるものに書き換えました。次のように私のコードは次のとおりです。テンプレート継承:シンボルが見つかりません
///////////////////////////// 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);
}
上記はすべて、「純粋なC++」のコードですが、私は私のsliding_var_window
機能はR.から呼び出し可能にエクスポートされるためR
パッケージの文脈でこれをやっています
上記は正常にコンパイルされますが、Rがdlopen
を使用してロードすると、save_result()
関数についてはSymbol not found
のエラーが発生します。奇妙なことに、私がこれを打ち砕く前に、他の同様の機能はうまく機能していましたが、これは正しく機能しませんでした。ここでは、ビルド・シーケンスです:
==> 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
かRcpp
とは何の関係もありませんが、誰かが、純粋なC++ツールチェーンで、この問題を実証するための方法を提案することができので、もしそれが、私のビルド環境を提供しています、と思われます大歓迎です。
私は理解していないもう一つちらほら - 私は、オブジェクトファイルで定義されたシンボルを見たとき、save_result()
機能は、私はそれがvoid
として宣言unsigned short
戻り値の型を、持っているように見えます:
% nm src/TSEvents.so | c++filt | grep result
0000000000002df0 unsigned short SlidingVar<double>::save_result()
U Slider<double>::save_result()
それは普通ですか?
実際に「最小限再現可能な例」にすることはできますか? –
@DirkEddelbuettel Fabianが私にどのように表示されたのか - 大型の無関係のR/Rcppセクションを取り除く方がいいですか、最後にreprexを追加する方がいいですか? –
あなたの 'nmの' U'を言う... | C++ filt'の出力は、既に 'man nm'を参照しているように、すでに煙草銃であった。 –