Неразрешенные ошибки внешней ссылки со сгенерированной DLL в Embarcadero C ++ Builder

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

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

В версии 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

person Sahil Bora    schedule 14.01.2020    source источник
comment
comment
Нет, потому что он использует функции из DLL в другой среде IDE, а именно в RAD studio. Если я вызываю функции в Visual Studio, все работает нормально.   -  person Sahil Bora    schedule 14.01.2020
comment
IDE не имеет значения. Неразрешенное внешнее - это неразрешенное внешнее. Причина одна и та же; в большинстве случаев вы не включили нужные библиотеки. Я хорошо знаю, что такое RAD Studio - я использую его, пока он существует.   -  person Ken White    schedule 14.01.2020
comment
Я преобразовал файл DLL из Visual Studio в версию, совместимую с RAD Studio, с помощью команды implib. Я также включил файл lib с комментарием #pragma (lib, AmazonAWSEmbeddedBuild)   -  person Sahil Bora    schedule 14.01.2020
comment
Вы сами создали DLL?   -  person M.M    schedule 14.01.2020
comment
Да, я сам построил dll   -  person Sahil Bora    schedule 14.01.2020


Ответы (1)


  1. искажение

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

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

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

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

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

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

  3. если ничего не работает, используйте динамическую ссылку на DLL

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

person Spektre    schedule 14.01.2020
comment
Первое решение сработало на моем компьютере, но когда я копирую сгенерированный файл lib и пытаюсь запустить его на компьютере моего коллеги, он не работает, но я поставлю ответ галочкой :) - person Sahil Bora; 14.01.2020
comment
У вас есть решение для вызова функций dll внутри формы студии RAD внутри Tmain :: Tman (), поскольку я получаю те же ошибки в проекте GUI, а не в консольном проекте. - person Sahil Bora; 14.01.2020
comment
@SahilBora вам необходимо добавить библиотеку в проект либо с помощью меню IDE добавить в проект, либо с помощью #pragma comment (lib, YourDLL.lib ) в нужном месте (код основной формы). если он работает на вашем компьютере, а не в школе, это может быть связано с тем, что у вас нет той же DLL или не нацелена на ту же платформу (x86 / x64), для которой предназначены библиотека и DLL. Также некоторые заголовки DLL требуют дополнительной настройки #define ... без подробностей я могу только догадываться - person Spektre; 14.01.2020
comment
@SahilBora, где именно находится ваша DLL? это где ваш exe или на каком-то пути, например в программном файле или system32 ... последнее может создать проблему на x64-битной платформе, если сделано для 32-битной ... #bullet 3 должен работать, несмотря ни на что ... но есть в некоторых случаях, когда даже это не работает из-за ошибки в winapi (присутствует на w2k, wxp, w7 ... не уверен насчет w8 / w10, поскольку я их не использую) есть библиотеки DLL, которые не могут быть полностью загружены и обычно до 5% функций не связаны ... Я столкнулся с этим с некоторыми старыми искаженными DLL-библиотеками C для эмулятора 3dfx. Но такие DLL действительно редко можно найти - person Spektre; 15.01.2020
comment
В RAD Studio я вызываю сгенерированную dll, используя комментарий #pragma (lib, MyDll.lib) в файле mainForm.cpp. Что касается платформы, на компьютере моего коллеги я использую ту же платформу x86 для программы Windows GUI, для которой мы пытаемся использовать dll. Я скопировал сгенерированный файл lib в каталог проекта. - person Sahil Bora; 15.01.2020
comment
Оказывается, для проектов Windows GUI в RAD studio все, что вам нужно было сделать, это зайти в Project- ›Добавить в проект-› Выбрать файл lib, и проблема была решена. - person Sahil Bora; 15.01.2020