C DLL隐式链接
我无法将DLL隐式链接到C控制台应用程序。 我使用VisualStudio2008 我创建了空的DLL项目“Library”,它只包含一个文件main.c:C DLL隐式链接,c,dll,dllimport,dllexport,C,Dll,Dllimport,Dllexport,我无法将DLL隐式链接到C控制台应用程序。 我使用VisualStudio2008 我创建了空的DLL项目“Library”,它只包含一个文件main.c: __declspec(dllexport) int get_value() { return 123; } __declspec(dllimport) int get_value(); void main() { int result = get_value(); } 我还使用main.c文件创建了空控制台项目“Cal
__declspec(dllexport) int get_value()
{
return 123;
}
__declspec(dllimport) int get_value();
void main()
{
int result = get_value();
}
我还使用main.c文件创建了空控制台项目“CallingProgram”:
__declspec(dllexport) int get_value()
{
return 123;
}
__declspec(dllimport) int get_value();
void main()
{
int result = get_value();
}
我将“Library.lib”添加到“Linker\Input\Additional Dependencies”
我仍然有一个错误:
error LNK2019: unresolved external symbol __imp__get_value referenced in function _main
我用LoadLibrary/GetProcAddress测试了创建的DLL-它工作正常
我使用DumpBin检查了Library.dll,它看起来也不错:
Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file library.dll
File Type: DLL
Section contains the following exports for Library.dll
00000000 characteristics
5340072C time date stamp Sat Apr 05 17:37:48 2014
0.00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint RVA name
1 0 00011109 get_value = @ILT+260(_get_value)
Summary
1000 .data
1000 .idata
2000 .rdata
1000 .reloc
1000 .rsrc
4000 .text
10000 .textbss
请帮我理解遗漏了什么
1 0 00011109获取_值
该符号没有正常的装饰。它通常是\u get\u value
,所有cdecl函数都有一个前导下划线。使用\u declspec(dllexport)
还提供\u imp\u get\u值
导出。它是优化绑定的函数指针
但这并没有发生,您必须在库项目中使用了.def文件。它重命名导出的函数。这没关系,但是现在您的\uuuu declspec(dllimport)
不兼容,DLL不再导出\uuuu imp
函数指针。链接器抱怨,因为它在导入库中找不到它
通过从库项目(best)中删除.def文件或从exe项目的声明中删除_declspec(dllimport)属性来修复此问题。强烈建议编写一个.h文件,在DLL中声明导出的函数
1 0 00011109获取_值
该符号没有正常的装饰。它通常是\u get\u value
,所有cdecl函数都有一个前导下划线。使用\u declspec(dllexport)
还提供\u imp\u get\u值
导出。它是优化绑定的函数指针
但这并没有发生,您必须在库项目中使用了.def文件。它重命名导出的函数。这没关系,但是现在您的\uuuu declspec(dllimport)
不兼容,DLL不再导出\uuuu imp
函数指针。链接器抱怨,因为它在导入库中找不到它
通过从库项目(best)中删除.def文件或从exe项目的声明中删除_declspec(dllimport)属性来修复此问题。强烈建议编写一个在DLL中声明导出函数的.h文件。使用.lib文件中的dumpbin.exe/all查看它包含的内容。从臀部拍摄,我猜想你是从C++源代码文件构建了DLL,并尝试在C程序中使用它。这需要
extern“C”
来抑制标识符名称的损坏。我不知道如何处理来自dumpbin的所有信息。我尝试了外部“C”-它没有帮助。在.dll文件上使用dumpbin.exe/exports,该文件足够短,可以复制/粘贴到您的问题中。很抱歉延迟。我做了“DumpBin/exports Library.dll”,并将结果添加到问题文本中。对我来说,它看起来不错。我使用LoadLibrary/GetProcAddress函数测试了Library.dll,它运行正常。这就是为什么我认为Library.lib文件有问题。请让我知道您的想法?使用.lib文件中的dumpbin.exe/all查看它包含的内容。从臀部拍摄,我猜想你是从C++源代码文件构建了DLL,并尝试在C程序中使用它。这需要extern“C”
来抑制标识符名称的损坏。我不知道如何处理来自dumpbin的所有信息。我尝试了外部“C”-它没有帮助。在.dll文件上使用dumpbin.exe/exports,该文件足够短,可以复制/粘贴到您的问题中。很抱歉延迟。我做了“DumpBin/exports Library.dll”,并将结果添加到问题文本中。对我来说,它看起来不错。我使用LoadLibrary/GetProcAddress函数测试了Library.dll,它运行正常。这就是为什么我认为Library.lib文件有问题。请告诉我你的想法,非常感谢。你是如何设法弄明白这一点的,真是令人着迷。DEF文件是我问题的根源-我将其从项目中删除,但它仍保留在“Linker\Input\Module Definition file”字段中。非常感谢。你是如何设法弄明白这一点的,真是令人着迷。DEF文件是我的问题的根源-我将其从项目中删除,但它仍保留在“Linker\Input\Module Definition file”字段中。