是否可以在 Ubuntu 中从 mono 调用 g++ 可执行文件的函数?请注意,C++ 和 C# 代码均在 Ubuntu 操作系统中编译。
C++ 应用程序源:
#include <stdlib.h>
static int32_t Sum(int32_t a, int32_t b){
return a + b;
}
/*
*
*/
int main(int argc, char** argv) {
return (EXIT_SUCCESS);
}
C# 单声道应用程序源:
using System;
using System.Runtime.InteropServices;
namespace MonoCsTest
{
class MainClass
{
[DllImport("/home/.../MonoCsTest/bin/Debug/testcpp")]
public static extern Int32 Sum(Int32 a, Int32 b);
public static void Main (string[] args)
{
Console.WriteLine (" 5 + 6 = " + Sum(5,6));
}
}
}
这会抛出 DllNotFoundException
最佳答案
您需要将库编译为共享库:静态库无法在运行时使用 P/Invoke 加载。 您添加 main() 函数的事实表明您正在将代码编译成可执行文件。 所以你的第一件事就是学习如何编译一个共享库,你可以尝试这样的事情:
gcc -shared -o libtestcpp.so testcpp.cpp
然后把DllImport名称改成完整库名的路径:
DllImport("/home/yourlogin/MonoCsTest/bin/Debug/libtestcpp.so")
您犯的另一个错误是没有考虑 C++ 强制名称修改:这里更简单的解决方案是将 Sum() 导出为 C 函数,并用 extern "C" {}
包围它。 .
要诊断此类错误,使用以下命令从单声道启用调试日志记录通常很有用:
MONO_LOG_LEVEL="debug" MONO_LOG_MASK="dll" mono yourprog.exe
关于c# - 在 ubuntu 操作系统中从单声道调用 g++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4108181/