System.DllNotFoundException: невозможно загрузить DLL с ядром dotnet

Мне было поручено вызвать openzwave из ядра dotnet в Linux, и у меня возникли проблемы с загрузкой ядра dotnet моей библиотеки c ++. По существу, каждый раз, когда я прикасаюсь к библиотеке openzwave, я получаю исключение dll not found.
вот моя программа.

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;

namespace MinOZWDotNet
{
public class Program
{

[DllImport("MinOZW")]
public static extern int Init();

[DllImport("MinOZW")]
public static extern int Free();

public static void Main(string[] args)
{
Console.WriteLine("Calling Init");
var val= Init();
Console.WriteLine($"retval= {val}");

while (true)
{

if (Console.KeyAvailable)
{

ConsoleKeyInfo key = Console.ReadKey();

if (key.Key == ConsoleKey.Escape)
{
Console.WriteLine("Exit");
break;
}
}
}

Console.WriteLine("Calling Free");
val = Free();
Console.WriteLine($"retval = {val}");

}
}
}

вот версия .so, которая работает

#ifdef __GNUC__
#define EXPORT extern "C"#define CC
#else
#define EXPORT extern "C" __declspec (dllexport)
#define CC __stdcall
#endif

#ifdef __GNUC__

#include <stdlib.h>
#include <unistd.h>

#include "Defs.h"
#else

#include "Windows.h"
#endifEXPORT int CC Init() {

return 0;
}

EXPORT int CC Free() {

return 0;
}

вот версия, которая дает мне ошибку

#ifdef __GNUC__
#define EXPORT extern "C"#define CC
#else
#define EXPORT extern "C" __declspec (dllexport)
#define CC __stdcall
#endif

#ifdef __GNUC__

#include <stdlib.h>
#include <unistd.h>

#include "Defs.h"
#else

#include "Windows.h"
#endif#include "Options.h"#include "Manager.h"#include "Driver.h"#include "Node.h"#include "Group.h"#include "Notification.h"#include "value_classes/ValueStore.h"#include "value_classes/Value.h"#include "value_classes/ValueBool.h"#include "platform/Log.h"
using namespace OpenZWave;EXPORT int CC Init() {
Manager::Create();
return 0;
}

EXPORT int CC Free() {
Manager::Destroy();
return 0;
}

и openzwave, и эта библиотека находятся на ожидаемом пути.
Н.Б. при компиляции на windows это все работает.
openZwave на github

1

Решение

Вы пытались использовать вашу библиотеку внутри C-программы? Может быть, у OpenZWave есть некоторые зависимости, которых нет в Linux …

2

Другие решения

Решил это !!
Я сделал программу на C ++, которая называется .so, которая указала мне на проблему 🙂

#include <iostream>
#include <dlfcn.h>

typedef int (*moo)();

int main()
{
std::cout << "Hello World!" << std::endl;
void* myso = dlopen("/home/mark/open-zwave/.lib/MinOZW.so", RTLD_NOW );//  void* myso = dlopen("/home/mark/open-zwave/libopenzwave.so", RTLD_NOW);

if (!myso){
std::cout << "Failed to load lib " << dlerror() << std::endl;
return 1;
}

//  moo func =(moo) dlsym(myso, "Free");

//  func();

dlclose(myso);

return 0;
}

g ++ -o main main.cpp -ldl
./главный

Привет, мир!

Не удалось загрузить lib

libopenzwave.so.1.4: невозможно открыть общий объектный файл: такого файла нет или
каталог

Одна быстрая символическая ссылка позже, и все это работает 🙂

0

По вопросам рекламы [email protected]