MT5 и DLL

 
Доброго времени суток!
Решил для себя написать dll, чтобы нормально связываться со своей основной программой на Qt.
Написал библиотеку,проверил её под Win и Linux - всё работает.
Прочитал статью https://www.mql5.com/ru/articles/18
Единственное, что отличается - библиотека собрана с использованием Qt, а не VS.
Положил библиотеку в Libraries

Сделал простой скрипт запуска
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#import "Libraries\\MQL5_dll.dll"
//#import "..\\Libraries\\MQL5_dll.dll" //TODO так тоже пробовал, ошибки те же
int add_value(int value);
#import

void OnStart()
{
   add_value(5);
}

После запуска в лог падает:
2021.08.05 19:53:17.728    test_dll (EURUSD,H1)    Cannot load 'Libraries\MQL5_dll.dll' [126]
2021.08.05 19:53:17.734    test_dll (EURUSD,H1)    Cannot call 'add_value', 'Libraries\MQL5_dll.dll' is not loaded
2021.08.05 19:53:17.734    test_dll (EURUSD,H1)    unresolved import function call

Заголовочный файл библиотеки:
#ifdef Q_OS_WIN
#   define MY_EXPORT __declspec(dllexport)
#else
#   define MY_EXPORT
#endif

extern "C" MY_EXPORT int add_value(int value);

Тело библиотеки:
int add_value(int value)
{
    return value + 5;
}

Что я делаю не так?
Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными?
Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными?
  • www.mql5.com
Так уж сложилось, что сейчас мало кто из разработчиков помнит, как написать простую DLL библиотеку и в чем особенности связывания разнородных систем. Я постараюсь за 10 минут на примерах продемонстрировать весь процесс создания простых DLL библиотек и раскрою некоторые технические детали нашей реализации связывания. Покажу пошаговый процесс создания DLL библиотеки в Visual Studio с примерами передачи разных типов переменных (числа, массивы, строки и т.д.) и защиту клиентского терминала от падений в пользовательских DLL.
 
В какой битности собираете проект dll?
Если в х32, то библиотека не загрузится.
МТ5 работает с х64 битностью.
 
SimpleUser:
Доброго времени суток!
Решил для себя написать dll, чтобы нормально связываться со своей основной программой на Qt.
Написал библиотеку,проверил её под Win и Linux - всё работает.
Прочитал статью https://www.mql5.com/ru/articles/18
Единственное, что отличается - библиотека собрана с использованием Qt, а не VS.
.....
Что я делаю не так?

путаешь библиотеку и компилятор, не думаешь о линкере и дин.загрузчике :-)

--kill-at спасёт отца русской демократии

 
x64
Русский язык не мой родной. Имел в виду, что в статье описывается создание DLL в VS, а я её сделал в креаторе с использованием Qt. Как и делал уже 100500 раз. :)
Непонятно, что именно не нравится терминалу...
 
SimpleUser:
x64

Может для Qt, нужно ещё точку входа прописывать?

 
Roman:

Может для Qt, нужно ещё точку входа прописывать?

Если только терминал её как-то по-особому загружает. Я выше написал, что после создания библиотек (в винде и linux) проверил их. Ладно, если бы это была моя первая библиотека - их уже очень много под разные железки. А вот с MT5 встречаюсь впервые.

 
SimpleUser:

Если только терминал её как-то по-особому загружает. Я выше написал, что после создания библиотек (в винде и linux) проверил их. Ладно, если бы это была моя первая библиотека - их уже очень много под разные железки. А вот с MT5 встречаюсь впервые.

убери в символах _

underscore мешает

навскидку не помню опцию gnu ld ,  посмотри в гугле про --kill-at

и надеюсь вы не C++ собирали, или добавляли __stdcall и extern "C" чтобы не использовать плюсовый манглинг
 
SimpleUser:

Если только терминал её как-то по-особому загружает. Я выше написал, что после создания библиотек (в винде и linux) проверил их. Ладно, если бы это была моя первая библиотека - их уже очень много под разные железки. А вот с MT5 встречаюсь впервые.

Для С++ попробуй так

Заголовочный файл библиотеки:
#ifdef Q_OS_WIN
#define MY_EXPORT extern "C" __declspec(dllexport)
#else
#define MY_EXPORT
#endif

MY_EXPORT int __stdcall add_value(int value);



Тело библиотеки:
MY_EXPORT int __stdcall add_value(int value)
{
    return value + 5;
}
 
Maxim Kuznetsov:

убери в символах _

underscore мешает

навскидку не помню опцию gnu ld ,  посмотри в гугле про --kill-at

и надеюсь вы не C++ собирали, или добавляли __stdcall и extern "C" чтобы не использовать плюсовый манглинг

Добавлял, конечно. Я уже говорю - это не первая моя библиотека. И, да, библиотека собирается с C++.
Но, QLibrary её прекрасно загружает. Как и остальные библиотеки. А вот MT5 не хочет. Да и логи какие-то куцые. Может где есть подробнее?
Кстати, символ "_" я тоже проверил - не в нём дело.

 
SimpleUser:

Добавлял, конечно. Я уже говорю - это не первая моя библиотека. И, да, библиотека собирается с C++.
Но, QLibrary её прекрасно загружает. Как и остальные библиотеки. А вот MT5 не хочет. Да и логи какие-то куцые. Может где есть подробнее?
Кстати, символ "_" я тоже проверил - не в нём дело.

посмотри зависимости своей библиотеки 

ldd прекрасно всё показывает

возможно какие-то Qt-шные зависимости не разрешаются, их надо перекладывать в правильные места

 
Maxim Kuznetsov:

посмотри зависимости своей библиотеки 

ldd прекрасно всё показывает

возможно какие-то Qt-шные зависимости не разрешаются, их надо перекладывать в правильные места

Там "библиотека" из одной функции. :) Хотя, посмотрю, мало ли