【发布时间】:2018-06-11 08:44:03
【问题描述】:
假设一个DLL有一个函数:
int TestFunc01(int v)
{
WCHAR buff[256];
::StringCchPrintf(buff, _countof(buff), L"You passed a value of %d", v);
return ::MessageBox(NULL, buff, L"Test Dll Message", MB_OK | MB_ICONINFORMATION);
}
仅按其序数值导出(以下是.def 文件):
LIBRARY DllName
EXPORTS
TestFunc01 @1 NONAME
所以现在当我想从另一个模块静态链接到该函数时,如果该函数是按其名称导出的,我将执行以下操作:
extern "C" __declspec(dllimport) int TestFunc01(int v);
int _tmain(int argc, _TCHAR* argv[])
{
TestFunc01(123);
}
但我如何仅通过其序数值静态链接到它?
PS。我正在使用 Visual Studio C++ 编译器和链接器。
【问题讨论】:
-
当您构建导出某些功能的项目时 - lib 文件总是会自动创建。您只需要将这个 lib 文件包含到另一个项目的链接器输入中,您想要在其中导入此函数。函数将按名称或序号导出无关紧要 -
extern "C" __declspec(dllimport) int TestFunc01(int v);+ lib 文件将起作用。因为您没有明确指定调用约定 - 两个项目必须具有相同的 -
@RbMm:当然,如果我从
.def文件中删除NONAME,它将按照您的描述工作。但这不是重点。我问的是使用序号函数号静态链接到该函数。否则,如果我尝试使用上面 DLL 中的.lib文件编译第二个模块,它将编译正常,但链接器将发出TestFunc01作为未声明的函数错误并且不会链接。 -
不,与
NONAME一起工作也很完美 -
@RbMm: :) 好吧,我正坐在一个 VS 2013 链接器前,它给了我这个错误。
-
这个完全不依赖于VS。查看你的 lib 文件 - 这里的
TestFunc01是哪种形式?哪个是未解析的符号(确切名称)报告的链接器?
标签: c++ visual-studio winapi dll dllimport