这个主题当然看起来不是“新”的,但是在阅读了许多帖子,博客和评论之后,我仍然没有什么智慧,并且无法使我的测试应用程序正常工作。
从实现的角度来看,我必须使用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查看函数名称时,函数名称为:
然后尝试在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(非常繁琐)?有“快速解决方案”吗?...吗?
答案 0 :(得分:3)
您似乎正在编译DJI代码,该代码使用特定于GCC的__attribute__ ((deprecated))
正确的解决方案是使用[[deprecated]]
。这是便携式的。结果,所有后续错误,例如“ DISTANCE_OVERFLOW
:无法使用带括号的初始化程序初始化数据成员”,也将消失。这是因为MSVC将(deprecated)
解析为带括号的初始化程序。