Skip to content

Latest commit

 

History

History
52 lines (43 loc) · 1.52 KB

ndk 虚函数表导致的编译问题.md

File metadata and controls

52 lines (43 loc) · 1.52 KB

编译器报错信息:
 error: undefined reference to 'vtable for CCheatGTASA'
 the vtable symbol may be undefined because the class is missing its key function
 
 代码如下:
 cheatI.h文件
 
 class CCheatI
{
public:
	CCheatI(){};
	virtual ~CCheatI(){};
	virtual void printfHelp() = 0;
	virtual void initCheatFun() = 0;
	virtual string& getFunSymByIndex(int index) = 0; 
protected:
	map<int,string> callMap;
};

class CCheatGTASA : public CCheatI
{
public:
	CCheatGTASA() {};
	virtual ~CCheatGTASA() {};
	virtual void printfHelp() {};
	virtual void initCheatFun() {};
	virtual string& getFunSymByIndex(int index) {};
};


cheatMain.cpp调用:
CCheatI* pCheat = new CCheatGTASA();

这种方式在ndk和visual stduio都可以编译通过
如果将CCheatGTASA的printfHelp initCheatFun getFunSymByIndex实现放在.cpp中,ndk编译不通过,visual stduio编译通过
原因:生成两个模块 ,cheatGTASA.cpp只加入到一模块中,和想象的不一样,开始以为是源文件编译有先后顺序
include $(BUILD_SHARED_LIBRARY)
include $(BUILD_EXECUTABLE)

虚函数表建立的时期:编译时
程序构建(Build)的四个过程(预编译、编译、汇编和链接)
《深度探索C++对象模型》
“表格中的virtual functions地址是如何被建构起来的?
在C++中,virtual functions(可经由其class object被调用)可以在编译时期获知。此外,这一组地址是固定不变的,执行期不可能新增或替换之。
由于程序执行时,表格的大小和内容都不会改变,所以其建构和存取皆可以由编译器完全掌控,不需要执行期的任何介入。”
https://www.cnblogs.com/xiehongfeng100/p/4678892.html

疑问:虚表里面的pointer应该是相对地址,程序启动后,在构造函数的initializer list 被重新计算???