在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();
}
- 'Allow unsafe code'也在项目属性下打勾
我在 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)
解析为带括号的初始化程序。
这个主题看起来确实不像 '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();
}
- 'Allow unsafe code'也在项目属性下打勾
我在 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 asinline
type is
const uint8_t &
所以我不知道哪个是'better'...尝试在 VS2017 (MSVC) 中读取 mingW DLL,或者尝试将实现代码转换为能够在 MSVC 中编译 DLL(非常乏味)?有'quick fix'吗?...请问?
您似乎正在编译 DJI 代码,它使用特定于 GCC 的 __attribute__ ((deprecated))
正确的解决方案是使用[[deprecated]]
。这是便携式的。结果,所有后续错误,如“DISTANCE_OVERFLOW
: 数据成员不能用带括号的初始化器初始化”也将消失。这是因为 MSVC 将 (deprecated)
解析为带括号的初始化程序。