这个主题当然看起来并不像'新',但在阅读了一些帖子,博客和评论后,我仍然没有更聪明,也无法使我的测试应用程序正常运行。
从实现的角度来看,我必须使用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查看函数名称时,函数名称为:
然后尝试在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(非常繁琐)?有“快速修复”吗?...好吗?
您似乎正在编译DJI代码,该代码使用GCC特定的__attribute__ ((deprecated))
正确的解决方案是使用[[deprecated]]
。这是便携式的。因此,所有后续错误,例如“DISTANCE_OVERFLOW
:数据成员无法使用带括号的初始化程序初始化”也将消失。这是因为MSVC将(deprecated)
解析为带括号的初始值设定项。