Неразрешенные ошибки внешней ссылки сгенерированной DLL в Embarcadero C ++ Builder - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь использовать AWS Iot SDK в Embarcadero C ++ Builder, который использую встроенную C версию SDK. Я пытался использовать сгенерированную DLL в IDE RAD Studio, но не смог ввести необходимые функции, так как все это было в пространствах имен и классах.

Поэтому я решил использовать версию SDK для Embedded C, о которой говорилось в этом вопросе, из-за его переносимости. Вызов функций DLL из пространства имен в RAD Studio

В версии SDK для Embedded 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 Ответ

1 голос
/ 14 января 2020
  1. искажение

    для установления связи c необходимо использовать правильную комбинацию переключателей implib, так как ваша DLL не была создана B CC он содержит скорее всего другое искажение имени ... try:

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

    или любую из 8 комбинаций переключателей (переименуйте winusb с вашим файлом).

  2. DLL должна соответствовать платформе

    , поэтому, если у вас есть 32-битный исполняемый файл, ваша DLL должна быть также 32-битной ... в противном случае вам понадобится мостовая DLL ... В случае windows драйверы учитывают, что 32-битные EXE / DLL на 64-битной ОС будут работать в WOW64, что может быть проблематично c доступ к реальному HW вместо эмулируемого.

    остерегайтесь старых версий implib, которые не обрабатывают 64-битные DLL (создайте пустые 1024-битные библиотеки) байтные библиотеки)

  3. если ничего не работает, используйте Dynami c DLL linkign

    см. Builder C ++, вызывающий класс VC ++

...