一个vs2010的项目中包含了多个dll工程,最近由于修改,对其中的两个dll工程A、B都拷贝了一份分别命名为C、D,然后修改原始工程中的文件名和类名,以便和原来的名称相区分,防止一不小心弄错了就麻烦了
原始的是B调用A,新的当然也就是D调用C了,修改完后,C编译正常,编译D的时候出现了错误提示,如下:
1>e:\dll\bcom\bcom.h(32): error C2470: “CComMgrBin”: 看起来像函数定义,但没有参数列表;跳过明显的函数体
我修改的时候主要是把相关的文件在UltraEdit中打开,然后候其中的类和包含的文件名,这样修改方便,不用到IDE中一个一个修改。
这个错误有点奇怪,原始的都好好的,为什么就修改了文件名和类名就不行了呢?
上网上查了查,基本确定是类CComMgrBin定义的附近有错误,但看不出问题,各符号都没有修改,不可能会变成全角或者中文的,在D中修改包含的C的头文件后再编译D工程,提示找不到头文件,说明包含的头文件也是没错的。
CComMgrBin的类定义如下:
... // 包含需要的头文件
#ifdef BCOMBIN_EXPORTS
#define BCOMBIN_API __declspec(dllexport)
#else
#define BCOMlBIN_API __declspec(dllimport)
#endif
// 此类是导出的,其它模块需要调用之
class BCOMBIN_API CComMgrBin: public CMyTask
{
private:
CComMgrBin();
virtual ~CComMgrBin();
... // 其它的接口和变量
根据提示,在编译完C之后,修改
class BCOMBIN_API CComMgrBin: public CMyTask
一行如下:
class CComMgrBin: public CMyTask
即把其中的BCOMBIN_API删除掉,然后编译D,结果通过!那确定就是这个定义有问题,再仔细检查
#ifdef BCOMBIN_EXPORTS
#define BCOMBIN_API __declspec(dllexport)
#else
#define BCOMlBIN_API __declspec(dllimport)
#endif
中的else分支才发现,其中多了一个“1”,即
#define BCOMlBIN_API __declspec(dllimport)
需要删除中间的“1”,修改后如下:
#define BCOMBIN_API __declspec(dllimport)
然后恢复
class BCOMBIN_API CComMgrBin: public CMyTask
再编译D通过!原来是在手动修改 BCOMBIN_API 的时候,中间多写了一个字符1导致dllimport实际上没有被定义,所以在调用的模块中就认为是错误的了。
希望对大家有帮助