c# - 在 ubuntu 操作系统中从单声道调用 g++

标签 c# c++ ubuntu mono pinvoke

是否可以在 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/

相关文章:

c# - OVER 子句中的 SQL ORDER BY 与 CLR 聚合不兼容?

c# - 当它具有已存在的外键对象时,如何使用 Entity Framework 添加对象

c++ - 何时使用静态类函数而不是命名空间函数?

python - Windows WSL 的 Poetry 安装不起作用,忽略 $HOME

android - Flutter Doctor 无法识别我的 ANDROID_SDK 环境变量

linux - Ubuntu 不识别任何命令

c# - 为什么在 Delphi 中循环比 C# 更快?

C++:在字符串中 move 语义#append

c++ - 扩展 C++ 字符串成员函数

c# - XmlSerializer.Deserialize 可以返回 null 吗?