Windows上的C++到F#绑定问题

ldioqlga  于 2023-02-05  发布在  Windows
关注(0)|答案(1)|浏览(101)

我的问题是:我需要用F#设计一个程序,从一个C++程序,执行简单的3D向量计算。我不分享下面代码的计算,因为问题停止在根据 * printfn * 创建向量。
所以我觉得是错误,但是我macOS的同学没有问题,可以正确运行代码,我推断是Windows的问题,可能是指针的问题,所以我就靠你来帮我了。
多谢了。
PS:网络版7.0.101当啷版15.0.5

    • 矢量3.cpp**
#include <math.h>
#include <iostream>
using namespace std;
int main() 
{
    return 0;
}
class Vector3
{
public:
double X;
double Y;
double Z;
Vector3(double x, double y, double z) : X(x), Y(y), Z(z) {}
};
extern "C" Vector3* CreateVector3(double x, double y, double z)
{
Vector3* v = new Vector3(x, y, z);
return v;
}
    • 程序. fs**
open System.Runtime.InteropServices
[<StructLayout(LayoutKind.Sequential)>]
printfn("test 1: Launching the program")
type Vector3 =
    val mutable X: double
    val mutable Y: double
    val mutable Z: double
    new(x, y, z) = { X = x; Y = y; Z = z }
[<DllImport("compiledVector3.exe")>]
extern Vector3 CreateVector3(double x, double y, double z)
[<DllImport("compiledVector3.exe")>]
extern double GetX(Vector3 v)
[<DllImport("compiledVector3.exe")>]
extern double GetY(Vector3 v)
[<DllImport("compiledVector3.exe")>]
extern double GetZ(Vector3 v)
[<DllImport("compiledVector3.exe")>]
extern double distanceTo(Vector3 v,Vector3 v2)
[<DllImport("compiledVector3.exe")>]
extern void vectorMovement(Vector3 v,double plusx, double plusy, double plusz)
[<DllImport("compiledVector3.exe")>]
extern Vector3 midpoint(Vector3 v,Vector3 v2)
[<DllImport("compiledVector3.exe")>]
extern double percentDistance(Vector3 pos1, Vector3 pos2, double percent)
printfn("test 2: DLL imported")

let FstVector= CreateVector3(0.0, 0.0, 0.0)
let SndVector= CreateVector3(1.0, 2.0, 3.0)
printfn("test 3: Vectors created")

我尝试使用基本的dotnet run命令启动Program. fs,希望在终端中看到以下行:

test 1: Launching the program
test 2: DLL imported
test 3: Vectors created

但没有第三行。

    • 终点站**
PS C:\Users\AlexisLasselin\Documents\GitHub\2022-2023-project-3-harfang3d-binding-Project-4-group\CppToFs\Vector3> dotnet run
test 1: Launching the program
test 2: DLL imported
PS C:\Users\AlexisLasselin\Documents\GitHub\2022-2023-project-3-harfang3d-binding-Project-4-group\CppToFs\Vector3>
5t7ly7z5

5t7ly7z51#

C++对于自由函数的默认调用约定是Cdecl,与平台无关,但是DllImport属性的默认调用约定是与平台相关的,在macOS上是Cdecl,而在Windows上不是(这里是StdCall)。幸运的是,修复很简单:

[<DllImport("compiledVector3.exe", CallingConvention = CallingConvention.Cdecl)>]

相关问题