繁体   English   中英

Embarcadero C++ Builder 中生成的 DLL 未解决的外部链接错误

[英]Unresolved external link errors with generated DLL in Embarcadero C++ Builder

我正在尝试在 Embarcadero C++ Builder 中使用 AWS Iot SDK,我使用的是 SDK 的嵌入式 C 版本。 我试图在 RAD Studio IDE 中使用生成的 DLL,但无法输入所需的函数,因为它都在命名空间和类下。

因此,由于它的可移植性,我决定使用本问题中讨论的 SDK 的嵌入式 C 版本。 在 RAD Studio 的命名空间下调用 DLL 函数

使用 SDK 的嵌入式 C 版本,我再次将其生成为一个 DLL 文件,我使用以下代码导出数据结构和函数,如下例所示:

#ifdef PUBSNUB_EXPORTS
#define PUBSNUB_API __declspec(dllexport)
#else
#define PUBSNUB_API __declspec(dllimport)
#endif

PUBSNUB_API IoT_Error_t aws_iot_mqtt_publish(AWS_IoT_Client* pClient, const char* pTopicName, uint16_t topicNameLen,
    IoT_Publish_Message_Params* pParams); 

PUBSNUB_API IoT_Error_t aws_iot_mqtt_subscribe(AWS_IoT_Client *pClient, const char *pTopicName, uint16_t topicNameLen,
                                   QoS qos, pApplicationHandler_t pApplicationHandler, void *pApplicationHandlerData);

当我尝试在 RAD Studio 中调用这些函数时,我收到以下错误,即使生成的 lib 文件按照说明复制到项目文件夹中也是如此。 如果我在 Visual Studio 项目中调用这些函数,它将完全正常工作。

[ilink32 Error] Error: Unresolved external '_iotClientConnectParamsDefault' referenced from C:\MICRO PLUS\RELEASE\MAINFORM.OBJ
[ilink32 Error] Error: Unresolved external '_iotClientInitParamsDefault' referenced from C:\MICRO PLUS\RELEASE\MAINFORM.OBJ
[ilink32 Error] Error: Unresolved external '_aws_iot_mqtt_publish' referenced from C:\MICRO PLUS\RELEASE\MAINFORM.OBJ
[ilink32 Error] Error: Unable to perform link
  1. 重整

    对于静态链接,您需要使用正确的implib开关组合,因为您的 DLL 不是由 BCC 创建的,它很可能包含不同的名称修改...尝试:

     implib.exe -c -f -a winusb.lib winusb.dll

    或 8 种开关组合中的任何一种(用您的文件重命名 winusb)。

  2. DLL 必须与平台匹配

    所以如果你有 32 位的可执行文件,你的 DLL 也必须是 32 位的……否则你需要一个桥 DLL……如果是 Windows 驱动程序,请注意 64 位操作系统上的 32 位 EXE/DLL 将在 WOW64 中运行,这可能会导致访问问题真正的硬件而不是模拟硬件。

    当心较旧的 implib 版本不处理 64 位 DLL(创建空的 1024 字节库)

  3. 如果没有任何效果,请使用动态 DLL 链接

    参见Builder C++ 调用 VC++ 类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM