Сборка open62541 DLL с помощью Visual Studio 2017

Здравствуйте, сообщество. Я хотел бы написать пользовательский интерфейс для сервера OPC UA, используя open62541 lib. Программное обеспечение ввода должно читать текстовый файл и передавать данные через сервер уже доступному клиенту.

Застрял на этапе, когда необходимо скомпилировать файл DLL для дальнейшего использования в проекте форм Windows.

Упоминается некоторая информация о том, что Дэви Трипонни скомпилировал его с помощью Visual C ++ 2013 https://github.com/open62541/open62541/wiki/Using-open62541-from-C%23

Но мне не повезло с VS 2017.

Последовательность моего продвижения:

  • Уже загружены 64-битные файлы .h и .c для Windows с https://open62541.org/
  • Создан проект библиотеки динамической компоновки (DLL).
  • К проекту прикреплены файлы .h и .c, выбран компилятор 64:

Проект

Получение предупреждений и ошибок при сборке:

Severity    Code    Description Project File    Line    Suppression State
Warning C4005   'CLOSESOCKET': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39113   
Warning C4005   '_Q_INVALIDATE': macro redefinition open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 130 
Warning C4005   'UA_atomic_sync': macro redefinition    open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 813 
Warning C4005   'UA_atomic_sync': macro redefinition    open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 815 
Warning C4005   'CLOSESOCKET': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 35386   
Warning C4005   'errno__': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 35387   
Warning C4005   'CLOSESOCKET': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39088   
Warning C4005   'CLOSESOCKET': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39106   
Warning C4005   'UA_sleep_ms': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39111   
Warning C4005   'UA_sleep_ms': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39127   
Warning C4005   'UA_sleep_ms': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39130   
Warning C4005   'WIN32_INT': macro redefinition open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39135   
Warning C4005   'OPTVAL_TYPE': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39136   
Warning C4005   'ERR_CONNECTION_PROGRESS': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39137   
Warning C4005   'UA_fd_set': macro redefinition open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39167   
Warning C4005   'UA_fd_isset': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39168   
Warning C4005   'errno__': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39176   
Warning C4005   'errno__': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39181   
Warning C4005   'INTERRUPTED': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39182   
Warning C4005   'WOULDBLOCK': macro redefinition    open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39183   
Warning C4005   'AGAIN': macro redefinition open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 39184   
Warning C4005   'ANSI_COLOR_RED': macro redefinition    open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 40158   
Warning C4005   'ANSI_COLOR_GREEN': macro redefinition  open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 40159   
Warning C4005   'ANSI_COLOR_YELLOW': macro redefinition open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 40160   
Warning C4005   'ANSI_COLOR_BLUE': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 40161   
Warning C4005   'ANSI_COLOR_MAGENTA': macro redefinition    open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 40162   
Warning C4005   'ANSI_COLOR_CYAN': macro redefinition   open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 40163   
Warning C4005   'ANSI_COLOR_RESET': macro redefinition  open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 40164   
Warning C4005   'BEGIN_CRITSECT': macro redefinition    open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 40709   
Warning C4005   'END_CRITSECT': macro redefinition  open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 40710   
Error   C1010   unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?    open62541   c:\users\scadaadmin\desktop\open62541-win64\open62541.c 43979   

Вопрос в том, как я могу скомпилировать файл dll с кодом open62541 c с помощью Visual Studio 2017, чтобы использовать его в приложении Windows Forms C # в качестве сервера?


person Klasik    schedule 04.03.2019    source источник
comment
Предупреждения я не считаю важными. Это последняя строчка. Вы открыли open62541.c и проверили строку: 43979?   -  person jdweng    schedule 04.03.2019
comment
Вероятно, это связано с выбором архитектуры. Если для архитектуры выбран POSIX, то win32 работать не будет. Официальные загрузки одного файла, похоже, предназначены для POSIX. Есть только одно решение: добавить все архитектуры в объединение. И оберните их условием (ifdef), чтобы использовалась только обнаруженная архитектура. Это означает, что нам нужно дополнительно определить архитектуру с помощью макросов. Но как на самом деле это сделать?   -  person Klasik    schedule 04.03.2019
comment
Вы открыли файл, как я сказал? Похоже, ты сделал то, что я предлагал.   -  person jdweng    schedule 05.03.2019
comment
Строка 43979 - конец файла .c, также я нашел статью об этом stackoverflow.com/questions/20113280/ .. но когда я установил не использовать предварительно скомпилированные заголовки появляется больше ошибок.   -  person Klasik    schedule 05.03.2019
comment
Какие были новые ошибки? Что за линия на 43979?   -  person jdweng    schedule 05.03.2019
comment
Задача решена. Нам нужно использовать CMake для переноса проекта для Visual Studio.   -  person Klasik    schedule 06.03.2019


Ответы (1)


Поскольку проект open62541 был обновлен, я предлагаю вам напрямую ознакомиться с текущим состоянием источников. Таким образом, вы сможете лучше использовать предоставленные ими примеры. Вот как создать проект. Может быть, это могло бы быть проще, но я столкнулся с довольно большим количеством проблем, поэтому я расскажу вам все шаги, которые я сделал.


ПОДГОТОВКА ОКРУЖАЮЩЕЙ СРЕДЫ

  1. Установите cmake (с обновлением PATH)

https://cmake.org/download/

  1. Установите последнюю версию python (с обновлением PATH)

https://www.python.org/downloads/

  1. Снова откройте сеанс, чтобы учесть новые переменные PATH.

  2. Устанавливаем модуль python "шестерка"

pip install шесть

СТРОИТЕЛЬСТВО MBEDTLS

  1. Скачать исходники библиотеки (лицензия apache)

https://tls.mbed.org/download

  1. Запускаем cmake в исходниках
cmake . -DUSE_SHARED_MBEDTLS_LIBRARY=ON -D CMAKE_BUILD_TYPE=Release
  1. Откройте «mbed TLS.sln» с помощью Visual Studio (я использую Community 2015) и сгенерируйте все в режиме «Release».

  2. Скопируйте следующие файлы

    • libraries .lib from "library\Release" to "Path\To\OpcUa_lib"
    • двоичные файлы .dll из "библиотеки \ Release" в "Путь \ To \ OpcUa_bin"
    • папка "mbedtls" в "include" к "Path \ To \ OpcUa_include"

ЗДАНИЕ ОТКРЫТО

  1. Клонируйте репозиторий open62541, чтобы получить исходники (с помощью рабочего стола GitHub или командной строки)

https://github.com/open62541/open62541

  1. Создайте папку "build" в источниках (например C: \ Users \ Davy \ Documents \ GitHub \ open62541 \ build)

  2. Откройте терминал в папке "build" и запустите cmake (сначала адаптируйте \ path \ To ...)

cmake .. -G "Visual Studio 14 2015" -DUA_ENABLE_ENCRYPTION=ON -DUA_ENABLE_AMALGAMATION=ON -DMBEDTLS_INCLUDE_DIRS="Path\To\OpcUa_include" -DMBEDTLS_LIBRARY="Path\To\OpcUa_lib" -DMBEDX509_LIBRARY="Path\To\OpcUa_lib" -DMBEDCRYPTO_LIBRARY="Path\To\OpcUa_lib" -DBUILD_SHARED_LIBS=ON -D CMAKE_BUILD_TYPE=Release -DUA_LOGLEVEL=100
  1. Откройте решение build \ open62541.sln с помощью Visual Studio (Community 2015) и добавьте mbedcrypto.lib, mbedtls.lib и mbedx509.lib в качестве ресурсов для компоновщика в проекте open62541 / lib / open62541. "

    • right click on "open62541/lib/open62541", select "properties"
    • перейдите в "Linker" => "General"
    • добавить "Path \ To \ OpcUa_lib" в качестве дополнительного каталога для зависимостей
    • перейдите в "Linker" => "Entry"
    • добавьте три строчки с mbedcrypto.lib, mbedtls.lib и mbedx509.lib в «Дополнительные зависимости»
  2. Сгенерируйте «open62541 / lib / open62541» в режиме «Release»

  3. Теперь вы можете использовать следующие файлы

    • the library "build\bin\Release\open62541.lib"
    • двоичный файл "build \ bin \ Release \ open62541.dll"
    • файл "build \ open62541.h"

ИНТЕГРАЦИЯ В ДРУГОЙ ПРОЕКТ

Вам нужно будет сослаться на объединенный .h файла open62541 и добавить эти зависимости в компоновщик: open62541.lib, mbedcrypto.lib, mbedtls.lib, mbedx509.lib, Ws2_32.lib. Также мне пришлось указать платформу Visual Studio 2013 (v120) в свойствах проекта.

person Davy    schedule 06.03.2019