【问题标题】:Using mingW compiled dll in VS2017在VS2017中使用mingW编译的dll
【发布时间】:2019-07-23 08:07:30
【问题描述】:

这个话题当然看起来并不“新”,但是在阅读了许多帖子、博客和 cmets 之后,我仍然没有更聪明,并且无法让我的测试应用程序正常工作。

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

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

而 示例 DLL 在使用 MSVC2107-64 位编译时在 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查看函数名时,函数名是:

然后尝试在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(非常繁琐)?有没有“快速修复”?...拜托?

【问题讨论】:

  • 您的术语似乎存在重大问题,这无助于您找到正确的搜索字词。 MSVC 是 Microsoft Visual C++ 编译器的常用缩写。这不是 C#。我什至不知道“在 VS2017 中读取 mingW DLL”是什么意思。你为什么要把 Qt 混在一起呢?这使情况变得更糟。通常,除非您对两种技术都相当流利,否则不应混合使用两种技术。您正在尝试混合 3(C#、C++、Qt)。
  • hmm 抱歉,我不这么认为...我正在 Qt 中编译 dll(不是通过 Visual Studio 中的 Qt VS 工具),使用 mingW 和 MSVC 编译器编译 DLL(从 C++ 代码创建 DLL)。并通过 Visual Studio 中用 C# 编写的示例应用程序测试 dll。当使用 MSVC 编译 dll 时,它可以在 C# 应用程序中工作(出于明显的原因),但在使用 mingW 编译器编译时则不行......
  • 这说明了很多。并且您已经检查了 MingW DLL 是否像 MSVC 构建一样是 x64 的?因为这是0x8007000B 的最常见原因。至于DISTANCE_OVERFLOW的问题;我们看不到代码。我建议就该部分提出一个新问题只是。

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


【解决方案1】:

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

正确的解决方案是使用[[deprecated]]。这是便携式的。结果,所有后续错误,例如“DISTANCE_OVERFLOW: A data member cannot be initialized with a parenthesized initializer”也将消失。这是因为 MSVC 将 (deprecated) 解析为带括号的初始值设定项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    相关资源
    最近更新 更多