Вопрос

Я пытаюсь запустить свое приложение на C # / C ++ в Linux после разработки его в Windows.

Небольшая его часть, FooLib, написана на C ++, который заимствован из C # для повышения производительности.FooLib не использует системных вызовов, только стандартную функциональность C ++.Он экспортирует единственную функцию, объявленную как:

extern "C" __declspec(dllexport) void Foo(float*, int, float*);

Он скомпилирован с помощью Visual C ++.Я попытался запустить приложение под управлением mono с помощью скомпилированного Windows FooLib.dll , но загрузка dll (DllImport) завершилась неудачей с:

Unhandled Exception: System.DllNotFoundException:Foo(single[2],int,single[])

Итак, что мне следует делать?

  • Каким-то образом изменить декларацию экспорта?
  • Скомпилируйте это в библиотеку .so с gcc в Linux, а затем загрузите это?
  • Скомпилировать его в .dll с gcc в Linux, затем загрузить это?
  • Что-то еще?
Это было полезно?

Решение

Вам нужно перекомпилировать вашу библиотеку в Linux, вы получите foolib.so.Затем вам нужно создать DllMap (проверьте эту ссылку) так что вам не нужно указывать имя библиотеки * .so для Linux в вашем коде C # и отдельную *.dll для Windows - это просто способ удобно сопоставить имя библиотеки в зависимости от операционной системы.

Другие советы

Очень классным инструментом для автоматизации собственных привязок является SWIG.http://www.swig.org/

Согласен с 1-м комментарием.Ваш .СЕТЕВОЙ код должен нормально работать в Linux без какой-либо перекомпиляции, но ваш собственный вызов должен быть скомпилирован изначально.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top