C DLL隐式链接

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

我无法将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文件创建了空控制台项目“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”字段中。