在VS2017中使用mingW编译的dll

Using mingW compiled dll in VS2017

这个主题看起来确实不像 'new' 但在阅读了很多帖子、博客和评论之后,我仍然 none 比较聪明,并且无法让我的测试应用程序正常工作.

从实现的角度来看,我必须用mingW编译dll(当使用其他MSVC编译器时,错误计数很大)。但是,这会在调用 c# VS2017 时出现错误:

System.BadImageFormatException: 'An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)'

示例 DLL 在使用 MSVC2107-64 位编译时在 Visual studio 项目中工作正常(但如果尝试编译 将产生 120 多个错误具有相同编译器的现有实现)。

我的 DLL 导出示例代码很简单(in Qt):

//qtLib.h
#pragma once

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

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

int __stdcall test()
    {
        return 10;
    }

导出这个用[=20=查看函数名时,函数名是:

然后尝试在 VS2017 (C#) 中调用 DLL:

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

public void testFunc()
{
    int val = test();
}

我在 MSVC 而非 mingW(在 Qt 中)中编译完整实现代码时遇到的错误类型是:

__attribute__: unknown override specifier

deprecated: undeclared identifier

DISTANCE_OVERFLOW: A data member cannot be initialized with a parenthesized initializer

DJI::OSDK::ErrorCode::MissionACK::WayPoint::DISTANCE_OVERFLOW: a static data member with an in-class initializer must have non-volative const integral type or be specified as inline

type is const uint8_t &

所以我不知道哪个是'better'...尝试在 VS2017 (MSVC) 中读取 mingW DLL,或者尝试将实现代码转换为能够在 MSVC 中编译 DLL(非常乏味)?有'quick fix'吗?...请问?

您似乎正在编译 DJI 代码,它使用特定于 GCC 的 __attribute__ ((deprecated))

正确的解决方案是使用[[deprecated]]。这是便携式的。结果,所有后续错误,如“DISTANCE_OVERFLOW: 数据成员不能用带括号的初始化器初始化”也将消失。这是因为 MSVC 将 (deprecated) 解析为带括号的初始化程序。