C++接口继承找不到构造函数和析构函数
在工作中有两个库A和B,其中A库中定义了一些接口(struct或虚基类,因为C++没有接口的概念所以用虚基类模拟接口),B库中的一些类实现A库定义的接口。
假设A库接口定义如下:
1 struct A_API Interface1 2 { 3 ~Interface1(); 4 virtual bool SetValue1(int nVal) = 0; 5 }
B库某类定义文件如下:
class B_API BInstance : public Interface1 { public: BInstance(); ~BInstance(); public: virtual bool SetValue1(int nVal); }
B库类的实现省略,这样A库编译和连接都没有问题,B库编译连接也都正常。但是当在B库中实例化BInstace时出现连接错误,提示找不到Interface1的构造函数和析构函数。在
实际工作中的两个库都是带有命名空间的,遇到这个问题时最初认为是命名空间的问题,可是去掉命名空间后问题依旧。我找!找了一个下午又一个晚上,终于找到了。原来是因为A库中
的接口定义加了类导出符A_API。原理为当B库的实现类在使用A库接口定义时因为A库中接口定义有导出符,这样连接器认为Interface1是有实现的,会去A库中找Interface1的实现,但
是因为Interface1只是个接口而没有实现(无实现对应的cpp文件),连接器自然也就找不到Interface1的函数什么的。去掉A库接口的导出符后编译连接一切恢复正常。