在VS2017中使用mingW编译的dll

问题描述 投票:0回答:1

这个主题当然看起来并不像'新',但在阅读了一些帖子,博客和评论后,我仍然没有更聪明,也无法使我的测试应用程序正常运行。

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

System.BadImageFormatException:'尝试加载格式不正确的程序。 (HRESULT异常:0x8007000B)'

虽然使用MSVC2107-64bit编译时,示例DLL在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(非常繁琐)?有“快速修复”吗?...好吗?

c# c++ visual-c++ mingw dji-sdk
1个回答
3
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.