无法加载,未定义的符号C ++名称错误

时间:2012-05-17 22:42:41

标签: c++ extern

执行程序时出现以下错误:

  

E:无法加载libsim.so:libsim.so:未定义的符号:_ZTV15IteratorRegFile

在sim.cpp中有s.th.像

//IteratorRegFileIs is a wrapper that calls the constructor for IteratorRegFile
Fwk::Ptr<IteratorRegFile> iteratorRegFile_ = IteratorRegFile::IteratorRegFileIs( "RF" );
void init(){
  SparseArrayInt64 *sparse_array = new SparseArrayInt64(segID);
}

在SparseArrayInt64.cpp中:

extern Fwk::Ptr<IteratorRegFile> iteratorRegFile_;

IteratorRegFile.h:

public:
  static IteratorRegFile::ValidPtr IteratorRegFileIs(Tac::Name _name) {
    IteratorRegFile * m = new IteratorRegFile(_name);
    m->referencesDec(1);
    return m;
  }
protected:
   IteratorRegFile( const IteratorRegFile& );
   explicit IteratorRegFile(Tac::Name _name): Tac::Entity(_name),
     index_(0) {
    handleInit();
   }

知道为什么编译器会破坏函数以便lib不再找到它了吗?

1 个答案:

答案 0 :(得分:0)

如果你在Linux上用gcc执行此操作:

根据c ++ filt _ZTV15IteratorRegFilevtable for IteratorRegFile。因此,受损的名称是指vtvable,而不是你的功能。

我做了一些搜索,发现了这个建议"You must implement virtual methods of your class because that's when the compiler actually generates the vtable for it."

您可以通过这种方式检查模块中的符号:
nm your-module-name

我猜这个链接可能会有所帮助: