swig + mono: C # пример ошибки не найденной библиотеки - PullRequest
2 голосов
/ 11 октября 2010

Я использую swig 2.0.1 + mono 2.6 / 2.8 в Mac OS X 10.6.4.

Общая сборка в порядке, и сборка примеров 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 

Похоже, что библиотека примеров не найдена, но сгенерированная библиотека - libexample.so.

Это источник библиотеки для создания libexample.so

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

Это источник C # для использования libexample.so.

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.so
make -f ../../Makefile CSHARPSRCS='*.cs' CSHARPFLAGS='-nologo -out:runme.exe' csharp_compile
gmcs -nologo -out:runme.exe *.cs

Что может быть не так?Что нужно сделать, чтобы дать моно знать о libexample.so?

ADDED

Я мог бы использовать "swig -csharp -dllimport" libexample.so "example.i", но я получилтот же результат.Я прилагаю examplePINVOKE.cs .

. Как написано в этом посте , я запустил «MONO_LOG_LEVEL = debug mono runme.exe».В сообщении говорится, что mono не может найти файл ./libexample.so даже при выходе из файла.

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

РЕШЕНИЕ

Я мог бы изменить Makefile в swig / examples, чтобы решить эту проблему.

CFLAGS     = -arch i386

Ответы [ 4 ]

2 голосов
/ 12 октября 2010

Вероятно, это связано с тем, что библиотека компилируется как 64-битная.«(Ноль)» означает, что Mono не удалось получить сообщение об ошибке этой ошибки.Вы можете исправить это, установив соответствующие флаги компиляции.Например:

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

Вы также можете исправить это, используя экспериментальную 64-битную поддержку Mono, но я никогда не делал этого, поэтому не уверен.

1 голос
/ 11 октября 2010

Вы можете указать, на какую DLL нацелены подписи pinvoke, в файле интерфейса.

1 голос
/ 12 октября 2010

Вы также должны убедиться, что файл находится в пути поиска динамического компоновщика, то есть в MacOS:

export DYLD_FALLBACK_LIBRARY_PATH="/directory/with/your/dylb/file:$DYLD_FALLBACK_LIBRARY_PATH"

Кстати, MacOS, как правило, ожидается файл .dylib, а не файл .so.

1 голос
/ 11 октября 2010

System.DllNotFoundException: пример

Похоже, он не может найти ваш неуправляемый DLL: "пример".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...