Мне было поручено вызвать 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
Вы пытались использовать вашу библиотеку внутри C-программы? Может быть, у OpenZWave есть некоторые зависимости, которых нет в Linux …
Решил это !!
Я сделал программу на 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: невозможно открыть общий объектный файл: такого файла нет или
каталог
Одна быстрая символическая ссылка позже, и все это работает 🙂