【问题标题】:Using a c++ builder application with an external dll使用带有外部 dll 的 c++ 构建器应用程序
【发布时间】:2020-10-17 01:15:17
【问题描述】:

我正在尝试在我的 c++ 构建器应用程序中使用 external dll。 dll(让我们称之为 X.dll)是使用 Qt Creator 创建的(使用 MingW 32 位编译器,也尝试过 gcc) 并由一个函数组成以保持简单(除了 X.dll,还创建了一个导入库 X.a)。

dll头(Dll_lib.h)基本上就是

__declspec(dllexport)  Dll_method(float *p, int n);

如果我创建一个简单的 Qt 应用程序,将 dll 头添加到它,并将其链接到 dll 导入库 X.a,everythink 可以按预期工作。

但是,当我尝试在我的 c++ 构建器应用程序中使用 dll 时,我收到“unresolved external _Dll_method referenced from ...”错误。

我的 c++ builder 应用程序中引用 dll 的部分看起来像

#include "lib\Dll_lib.h"

#pragma comment(lib, "X.lib")

__declspec(dllimport)  Dll_method(float *p, int n);

.....

X.lib 是使用与 c++ builder 捆绑在一起的 implib 工具直接从 dll 创建的。我还尝试使用 coff2omf 工具从 X.a 创建 X.lib,但没有任何效果,而且我总是收到相同的错误消息。

【问题讨论】:

    标签: c++ qt dll


    【解决方案1】:

    C++ 环境有一个习惯名称修改以支持重载,具有相同名称的不同参数,例如:

    int use(int x, char y); // mangles to something like use__Int__Chr.
    int use(double x);      // mangles to something like use__Dbl.
    

    这允许根据参数链接正确的

    您可能需要将其包装在 extern "C" 中以使其不破坏名称,例如:

    extern "C" {
        __declspec(dllimport)  Dll_method(float *p, int n);
    }
    

    这是假设您在创建它时没有进行名称修改,并从假设它被修改的东西中使用它。如果它在 both 两侧都被破坏,您可能必须创建 将它与 extern "C" 一起使用,因为不能保证不同的编译器会与 same 规则。


    顺便说一句,您应该能够检查由您的工具链创建的目标文件或 DLL,以确定该函数在其定义的位置调用了什么以及调用者期望它是什么。在 Linux 下,我会使用 nm 之类的东西,我不确定 Windows 的等价物是什么。

    【讨论】:

    • 我已经试过了,同样的错误,但还是谢谢。
    • @dsp_user: 你是在编译 both 面吗?根据更新,没有强制要求不同的环境使用 same 规则进行修改。最好在创建函数的位置和调用它的位置都将其关闭。
    • 我尝试过不要在两边都使用名字修饰(extern C on both)。让我看看能不能找出导入库中到底写了什么。
    • 是的,这是名称修改。我错误地认为我在两端都放置了 extern c。
    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 2012-07-07
    • 2010-10-03
    • 2015-09-05
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多