【问题标题】:Unable to export functions from C++ DLL无法从 C++ DLL 导出函数
【发布时间】:2012-09-06 10:47:04
【问题描述】:

我需要使用 Visual Studio 2008 创建一个 C++ MFC DLL。为此,我在 Visual Studio 中创建了一个 DLL MFC Win32 控制台项目,并创建了一个函数来创建一个对象并使用其方法将字符串打印到屏幕上。有点像这样:

__declspec(dllexport) void Foo(void);

在哪里:

    void Foo(void){
    print* obj = new print;
    obj->testPrint();
    return;
}

void print::testPrint(void){
    printf("Bar\n");
    return;
}

它编译成功并生成 DLL,但是当我尝试使用它时,我总是得到: “错误 LNK2019:无法解析的外部符号“void __cdecl Foo(void)”

我尝试使用 Dependency Walker,但它没有在 DLL 中显示任何功能。难道我做错了什么?我已经搜索了很多,但仍然没有从可能发生的事情中得出任何结论。

【问题讨论】:

  • 您是否正在将您的应用程序与使用您的 dll 创建的导入库链接?
  • 是的,我认为链接没问题。我的猜测是,也许 DLL 出现损坏或其他问题。 Dependency Walker 甚至无法在其中找到任何内容。
  • 您没有链接到 .dll,所以这不是问题。
  • 你的控制台应用程序是否有这样的 Foo 原型:__declspec(dllimport) void Foo(void);
  • 请记住,您在 dll 本身中使用 __declspec(dllexport) 并为使用 dll 的任何应用程序使用 __declspec(dllimport)。

标签: c++ visual-studio-2008 dll mfc


【解决方案1】:

听起来您可能没有在任何 cpp 文件中包含指定导出的头文件。请记住,cpp 文件是唯一实际编译的文件。因此,请确保在至少一个 cpp 文件中包含带有 __declspec(dllexport) void Foo(void); 的标头。还要确保您的项目链接器->输入设置没有指定“模块定义文件”(def)文件。

在依赖遍历器显示某些内容已实际导出之前,不要费心尝试链接到 DLL。

【讨论】:

  • 这就是问题所在!我没有在任何 .cpp 文件中包含头文件。非常感谢!
【解决方案2】:

Windows 默认为 cdecl,因此您需要明确表明它是在调用者中导出的 declspec - 或者将其从 DLL 中导出为 cdecl。

【讨论】:

    【解决方案3】:

    您还需要从 CPP 文件中导出该符号:

    __declspec(dllexport)
    void Foo(void)
    { 
        print* obj = new print; 
        obj->testPrint(); 
        return; 
    } 
    

    标头中的规范仅适用于客户端 (EXE),并提示来自服务器 (DLL) 的链接器。

    【讨论】:

    • 恐怕这不太对。定义不需要导出声明,但它们必须匹配其他所有内容,例如调用约定等。
    • 是的,这是真的 - 声明必须匹配。但是我看到链接器无法导出/解析符号,除非从实现文件中明确导出。
    • 我们从未将出口声明放在 cpp 文件中的定义上。我们只在 .h 文件中包含该信息(取决于它的包含方式)将 dllimport 或 dllexport。这不是一个大问题,但应该避免任何增加维护开销的事情。
    猜你喜欢
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多