松鼠的博客

导航

解决 静态链接的 unresolved external 错误

问题描述: 在Visual Studio 6.0中编写动态链接库(DLL),并在C++ Builder 6.0中使用静态链接的方式调用DLL,如果使用Visual Studio 6.0默认的DLL函数导出代码则 C++ Builder 会提示类似于 unresolved external (符号未导出)的错误。

相关说明:_stdcall 调用方式
如果通过VC++编写的DLL欲被其它语言编写的程序调用,应将函数的调用方式声明为_stdcall方式,WINAPI都采用这种方式,而C/C++默认的调用方式却为_cdecl。_stdcall方式与_cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C++中需要将函数声明为 extern "C"),_stdcall调用约定在输出函数名前面加下划线,后面加"@"符号和参数的字节数,形如 _functionname@number;而_cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。

(1)在VC某个类的头文件中(.h文件):

extern "C" __declspec(dllexport) int __stdcall TestFun(void);   

 

(2)在类的实现文件中(.cpp文件):

__declspec(dllexport) int __stdcall TestFun(void)
{
 
return 1986;
}

 

这里函数的申明方式最关键,Visual Studio 6.0 当中的函数申明方式并不标准,需要开发人员自已手动修改。

(3)在 C++ Builder 6.0 中某个类的头文件中添加下面代码

#include "NonMfcDll.h"//包含导出函数定义的头文件
#pragma comment(lib, "bcbdll.lib")//包含生成DLL同时生成的lib文件,包含前需要使用 coff2omf 命令转换一下。

 

(4)在C++ Builder 的工程文件中直接调用 TestFun();

posted on 2008-11-18 14:05  Xproer-松鼠  阅读(2007)  评论(0)    收藏  举报