Использование mingW скомпилированного dll в VS2017 - PullRequest
0 голосов
/ 01 марта 2019

эта тема, конечно, не выглядит «новой», но после прочтения ряда постов, блогов и комментариев я все еще не знаю, и не могу заставить работать мое тестовое приложение.

С точки зрения реализации I должен скомпилировать dll с помощью mingW (когда используются другие компиляторы MSVC, количество ошибок является значительным).Однако это вызывает ошибку при вызове в c # VS2017:

System.BadImageFormatException: «Была сделана попытка загрузить программу с неверным форматом.(Исключение из HRESULT: 0x8007000B) '

В то время как образец DLL отлично работает в проекте Visual Studio при компиляции с MSVC2107-64bit (но при попытке компиляции выдает 120+ ошибок) существующая реализация с тем же компилятором).

Мой пример кода для экспорта в DLL прост ( в Qt ):

//qtLib.h
#pragma once

extern "C"
{
    __declspec(dllexport) int __stdcall test();
}

//qtLib.cpp
#include "qtlib.h"

int __stdcall test()
    {
        return 10;
    }

При экспорте этогои просмотр имени функции с помощью Dependency Walker , имя функции:

Dependency Walker view

Затем попытка вызвать DLL в VS2017 (C #):

[DllImport("QtLib.dll", EntryPoint = "test@0", CallingConvention = CallingConvention.StdCall)]
        static extern int test();

public void testFunc()
{
    int val = test();
}
  • 'Разрешить небезопасный код' также отмечен в свойствах проекта

И тип ошибок, которые я получаю при компиляции полного кода реализации вMSVC, не mingW (в Qt):

__attribute__: неизвестный спецификатор переопределения

deprecated: необъявленный идентификатор

DISTANCE_OVERFLOW: данныеэлемент не может быть инициализирован инициализатором в скобках

DJI::OSDK::ErrorCode::MissionACK::WayPoint::DISTANCE_OVERFLOW: статический элемент данных с iИнициализатор n-класса должен иметь неизменяющий константный интегральный тип или быть задан как inline

тип равен const uint8_t &

Так что я понятия не имею, что лучше... чтобы попытаться прочитать mingW DLL в VS2017 (MSVC), или попытаться преобразовать код реализации, чтобы иметь возможность компилировать DLL в MSVC (очень утомительно)?Есть ли "быстрое решение"? ... пожалуйста?

1 Ответ

0 голосов
/ 01 марта 2019

Похоже, что вы компилируете код DJI, который использует специфичный для GCC __attribute__ ((deprecated))

. Правильное решение - использовать [[deprecated]].Это портативный.В результате все последующие ошибки, такие как «DISTANCE_OVERFLOW: элемент данных не может быть инициализирован инициализатором в скобках», также исчезнут.Это связано с тем, что MSVC анализирует (deprecated) как инициализатор в скобках.

...