gpt4 book ai didi

c# - swig + 单声道 : C# example errors of not finding the library

转载 作者:行者123 更新时间:2023-12-04 00:48:25 26 4
gpt4 key购买 nike

我在 Mac OS X 10.6.4 上使用 swig 2.0.1 + mono 2.6/2.8。

整体构建还可以,C#例子的构建也还可以。问题是当我运行示例 (mono runme.exe) 时,我总是会遇到以下错误。

Unhandled Exception: System.TypeInitializationException: An exception was thrown by the type initializer for examplePINVOKE ---> System.TypeInitializationException: An exception was thrown by the type initializer for SWIGExceptionHelper ---> System.DllNotFoundException: example  at (wrapper managed-to-native) examplePINVOKE/SWIGExceptionHelper:SWIGRegisterExceptionCallbacks_example (examplePINVOKE/SWIGExceptionHelper/ExceptionDelegate,examplePINVOKE/SWIGExceptionHelper/ExceptionDelegate,examplePINVOKE/SWIGExceptionHelper/ExceptionDelegate,examplePINVOKE/SWIGExceptionHelper/ExceptionDelegate,examplePINVOKE/SWIGExceptionHelper/ExceptionDelegate,examplePINVOKE/SWIGExceptionHelper/ExceptionDelegate,examplePINVOKE/SWIGExceptionHelper/ExceptionDelegate,examplePINVOKE/SWIGExceptionHelper/ExceptionDelegate,examplePINVOKE/SWIGExceptionHelper/ExceptionDelegate,examplePINVOKE/SWIGExceptionHelper/ExceptionDelegate,examplePINVOKE/SWIGExceptionHelper/ExceptionDelegate)  at examplePINVOKE+SWIGExceptionHelper..cctor () [0x00000] in :0   --- End of inner exception stack trace ---  at examplePINVOKE..cctor () [0x00000] in :0   --- End of inner exception stack trace ---  at example.gcd (Int32 x, Int32 y) [0x00000] in :0   at runme.Main () [0x00000] in :0 

It seems like that it doesn't find the example library, but the generated library is libexample.so.

This is the source of the library to generate libexample.so

double Foo = 3.0;
int gcd(int x, int y) {
...
}

这是使用 libexample.so 的 C# 源代码。

using System;

public class runme
{
static void Main()
{
int x = 42;
int y = 105;
int g = example.gcd(x,y);
...
}
}

这是使用 SWIG 生成的包装函数。

/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
* Version 2.0.1
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
* ----------------------------------------------------------------------------- */
using System;
using System.Runtime.InteropServices;

public class example {
public static int gcd(int x, int y) {
int ret = examplePINVOKE.gcd(x, y);
return ret;
}

public static double Foo {
set {
examplePINVOKE.Foo_set(value);
}
get {
double ret = examplePINVOKE.Foo_get();
return ret;
}
}
}

这是获取库和执行的命令。

gcc -c    example.c example_wrap.c cc -bundle -undefined suppress -flat_namespace  example.o  example_wrap.o   -o libexample.somake -f ../../Makefile CSHARPSRCS='*.cs' CSHARPFLAGS='-nologo -out:runme.exe' csharp_compilegmcs -nologo -out:runme.exe *.cs

可能出了什么问题?应该怎么做才能让 mono 知道 libexample.so?

已添加

我可以使用“swig -csharp -dllimport "libexample.so"example.i",但我得到了相同的结果。我附上 examplePINVOKE.cs .

如本 post 中所写,我运行了“MONO_LOG_LEVEL=debug mono runme.exe”。该消息说单声道找不到 ./libexample.so,即使文件已退出。

Mono: DllImport loading library: './libexample.so'.Mono: DllImport error loading library '(null)'.

解决方案

我可以更改 swig/Examples 中的 Makefile 来解决这个问题。

CFLAGS     = -arch i386

最佳答案

这可能是由于库被编译为 64 位造成的。 “(null)”表示 Mono 无法获取此错误的错误消息。您可以通过设置适当的编译标志来解决此问题。例如:

./configure CFLAGS="-O -arch i386" CXXFLAGS="-O -arch i386" LDFLAGS="-arch i386" --disable-dependency-tracking

您也可以通过使用 Mono 的实验性 64 位支持来解决此问题,但我从未这样做过,所以不确定。

关于c# - swig + 单声道 : C# example errors of not finding the library,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3907041/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com