Embarcadero C++ Builder 中生成的 DLL 未解决的外部 link 错误
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 版本,因为它具有可移植性。 Calling DLL Functions under a namespace in RAD Studio
使用 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
处理
对于静态链接,您需要使用 implib
开关的正确组合,因为您的 DLL 不是由 BCC 创建的,它很可能包含不同的名称修改...尝试:
implib.exe -c -f -a winusb.lib winusb.dll
或开关的 8 种组合中的任意一种(用您的文件重命名 winusb)。
DLL必须匹配平台
所以如果你有 32 位可执行文件,你的 DLL 也必须是 32 位的......否则你需要一个桥接 DLL......如果是 windows 驱动程序,请注意 32 位 EXE/DLLs 64 位 OS 将 运行 在 WOW64 中,这可能会在访问真实硬件而不是模拟硬件时出现问题。
注意较旧的 implib 版本不处理 64 位 DLL(创建空的 1024 字节库)
如果没有效果使用动态 DLL linkign
见Builder C++ calling VC++ class
我正在尝试在 Embarcadero C++ Builder 中使用 AWS Iot SDK,我正在使用 SDK 的嵌入式 C 版本。我试图在 RAD Studio IDE 中使用生成的 DLL,但无法输入所需的函数,因为它都在名称空间和 类 下。
因此我决定使用这个问题中提到的 SDK 的嵌入式 C 版本,因为它具有可移植性。 Calling DLL Functions under a namespace in RAD Studio
使用 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
处理
对于静态链接,您需要使用
implib
开关的正确组合,因为您的 DLL 不是由 BCC 创建的,它很可能包含不同的名称修改...尝试:implib.exe -c -f -a winusb.lib winusb.dll
或开关的 8 种组合中的任意一种(用您的文件重命名 winusb)。
DLL必须匹配平台
所以如果你有 32 位可执行文件,你的 DLL 也必须是 32 位的......否则你需要一个桥接 DLL......如果是 windows 驱动程序,请注意 32 位 EXE/DLLs 64 位 OS 将 运行 在 WOW64 中,这可能会在访问真实硬件而不是模拟硬件时出现问题。
注意较旧的 implib 版本不处理 64 位 DLL(创建空的 1024 字节库)
如果没有效果使用动态 DLL linkign
见Builder C++ calling VC++ class