System.DllNotFoundException:无法使用dotnet核心

时间:2017-01-26 10:08:52

标签: c++ c linux .net-core

我的任务是从linux上的dotnet核心调用openzwave,我遇到了dotnet核心加载我的c ++库的问题。基本上任何时候我触摸openzwave库我得到一个DLL未找到异常。 这是我的program.cs

    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"

#endif



EXPORT 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和这个lib都在预期的路径上。 N.B在Windows上编译时这一切都有效。 openZwave on github

2 个答案:

答案 0 :(得分:2)

您是否尝试在C程序中使用lib?也许OpenZWave有一些在Linux上缺少的依赖...

答案 1 :(得分:0)

解决了!! 我制作了一个名为.so的c ++程序,它指出了我的问题:)

#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
  ./main

     

Hello World!

     

无法加载lib

     

libopenzwave.so.1.4:无法打开共享对象文件:没有这样的文件或   目录

之后的一个快速sym链接,一切正常:)