Happy coder 2024-01-14 19:22 采纳率: 50%
浏览 10
已结题

linux环境,C#调用c++编译后的so文件报错

我在linux环境下,用clion工具建了工程,命名为test,里面有个hello的方法。我想把这个工程打包为一个so文件,在C#代码中去调用这个hello方法,但是始终没有成功,系统一直提示 Unable to find an entry point named "hello" in shared library 'libtest.so',麻烦帮忙看下是什么问题

C++工程中的library.cpp文件

img

C++工程中的library.h文件

img

CMakeLists.text文件

img

C#中的调用代码.

img

报错代码:

img

  • 写回答

18条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-01-14 19:23
    关注
    获得0.60元问题酬金

    引自免费微信小程序:皆我百晓生

    根据您提供的信息,您遇到的问题是在Linux环境下,使用C#调用C++编译后的so文件时出现了错误。系统提示找不到共享库中名为"hello"的入口点。

    根据您提供的C++代码,发现在library.cpp中定义了一个名为"hello"的函数。为了正确调用这个函数,您需要注意以下几点:

    1. 检查函数命名:确保函数的命名和调用一致,即C#代码中的函数声明是hello而不是其他的名称。

    2. 检查函数声明修饰符:在C#代码中,您需要使用DllImport特性来声明调用C++函数。请确保DllImport特性中的dllName参数值与实际的共享库名称相匹配。对于您的情况,应该是Libtest.so而不是其他。另外要注意,确保使用的调用约定(CallingConvention)与C++代码中的约定一致。

    3. 确保共享库路径正确:在C#代码中,确保您指定的共享库路径正确。如果共享库不在与C#代码相同的目录中,您可能需要提供完整的路径或在系统环境变量中配置路径。

    基于您提供的信息,以下是可能的解决方案:

    1. 在C++代码中使用extern "C"修饰符,确保函数以C语言的方式进行编译和链接,这允许C#代码正确调用函数。在library.h文件中添加如下声明:
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    void hello();
    
    #ifdef __cplusplus
    }
    #endif
    
    1. 在C#代码中,将DllImport特性中的dllName参数修改为实际的共享库名称,并指定正确的调用约定:
    [DllImport("libtest.so", CallingConvention = CallingConvention.Cdecl)]
    public static extern void hello();
    
    1. 确保C++共享库和C#代码在相同的目录下,或者在C#代码中指定正确的共享库路径。

    请按上述方法进行尝试并检查您的C#代码是否仍然报错。如果问题仍然存在,可以提供更多的代码和细节信息,以便我们进一步帮助您解决问题。

    评论

报告相同问题?

问题事件

  • 系统已结题 1月22日
  • 创建了问题 1月14日

悬赏问题

  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计