在VS2017中使用mingW编译的dll

时间:2019-03-01 09:57:25

标签: c# c++ visual-c++ mingw dji-sdk

这个主题当然看起来不是“新”的,但是在阅读了许多帖子,博客和评论之后,我仍然没有什么智慧,并且无法使我的测试应用程序正常工作。

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

  

System.BadImageFormatException:'试图加载格式错误的程序。 (HRESULT的异常:0x8007000B)'

示例DLL 在用MSVC2107-64bit进行编译的Visual Studio项目中工作正常(但是如果尝试使用同一编译器编译现有实现,则会产生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

然后尝试在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__:未知的覆盖说明符

     

deprecated:未声明的标识符

     

DISTANCE_OVERFLOW:无法使用带括号的初始值设定项来初始化数据成员

     

DJI::OSDK::ErrorCode::MissionACK::WayPoint::DISTANCE_OVERFLOW:具有类内初始化程序的静态数据成员必须具有非常量const整型或指定为inline

     

类型为const uint8_t &

所以我不知道哪个是“更好的” ...尝试在VS2017(MSVC)中读取mingW DLL,或者尝试转换实现代码以能够在MSVC中编译DLL(非常繁琐)?有“快速解决方案”吗?...吗?

1 个答案:

答案 0 :(得分:3)

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

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