__declspec(dllexport) 符号导出解决链接失败

来源:清泛原创     2016-11-16 16:06:18    人气:     我有话说( 0 人参与)

清泛网(www.tsingfun.com):error LNK2019: 无法解析的外部符号 "public: __thiscall CBtt::CBtt(void)" (??0CBtt@@QAE@XZ),该符号在函数 "protected: __thiscall COwnerView::COwnerView(void)"

error LNK2019: 无法解析的外部符号 "public: __thiscall CBtt::CBtt(void)" (??0CBtt@@QAE@XZ),该符号在函数 "protected: __thiscall COwnerView::COwnerView(void)" (??0COwnerView@@IAE@XZ) 中被引用

error LNK2019: 无法解析的外部符号 "public: __thiscall CBtt::~CBtt(void)" (??1CBtt@@QAE@XZ),该符号在函数 "public: void * __thiscall CBtt::`scalar deleting destructor'(unsigned int)" (??_GCBtt@@QAEPAXI@Z) 中被引用

1>../outdir/Debug/xxx.exe : fatal error LNK1120: 2 个无法解析的外部命令

的编译错误。

原因是引用的dll中的函数没有导出导致,可以用Depends打开dll查看验证,使用如下的宏申明解决:

#ifdef _EXPORTING
#define API_DECLSPEC    __declspec(dllexport)
#else
#define API_DECLSPEC    __declspec(dllimport)
#endif
...
class API_DECLSPEC CBtt
{
public:
    CBtt(void);
    ~CBtt(void);
};

注意:宏必须放在 class 与对象名中间,不可放在class的前面。


再来个跨平台版本:

#ifdef WIN32
	#ifdef XXX_EXPORTS
		#define XXX_API __declspace(dllexport)
	#else
		#define XXX_API __declspace(dllimport)
	#endif
	#define XXX_LOCAL
#else
	#ifdef XXX_EXPORTS
		#define XXX_API __attribute__ ((visibility("default")))
	#else
		#define XXX_API
	#endif
	#define XXX_LOCAL __attribute__ ((visibility("hidden")))
#endif

...
class XXX_API Object {
...
};
Linux与Windows导出不同的地方在于:
1、Windows默认不导出,需要导出的话必须申明;Linux默认全部导出,但是很多时候默认的编译选项都加上了 -fvisibility=hidden 指定不导出,然后使用上面的宏,自定义导出,与Windows就类似了。

__declspec dllexport

注:本文为本站或本站会员原创优质内容,版权属于原作者及清泛网所有,
欢迎转载,转载时须注明版权并添加来源链接,谢谢合作! (编辑:admin)