2017-01-26 8 views
1

私はLinux上でdotnet coreからopenzwaveを呼び出すタスクがありましたが、私のC++ライブラリを読み込むdotnetコアに問題があります。基本的に私はopenzwaveライブラリに触れるたびに、例外が見つからないdllを取得します。 は、ここに私のProgram.csの相続人 System.DllNotFoundException:dotnetコアでDLLを読み込めません

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}"); 

      } 
     } 
    } 

私にエラー

#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を与えている相続人

#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; 
} 

バージョンを作品の.soのバージョンです予想される経路上にある。 N.Bウィンドウでコンパイルすると、これはすべて動作します。 openZwave on github

答えて

2

libをCプログラム内で使用しようとしましたか?たぶん、OpenZWaveにLinux上で欠けている依存関係があるかもしれません...

+0

私はこのソースをMinOZWのサンプルから取り出して、実行可能ファイルを作成し、それを変更しました。実行ファイルはlinuxで動作します。 – Mark

+0

CRLが "MinOZW.so"を見つけることができないので、この例外([docs](https://msdn.microsoft.com/en-us/library/system.dllnotfoundexception.aspx)を読む)がスローされます。それは "大文字と小文字を区別"問題だと思ったが、私はそれを除外するように動作するバージョンを持っています... – Seididieci

+0

私はリンカが非バージョン化libopenzwaveを探す必要があると思います。あなたの助けをありがとう – Mark

0

解決済みです! は、私が問題:)

#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; 
} 

グラム++ -oメインmain.cppに ./main

Hello Worldの
-ldlに私を指摘する.soと呼ばれるC++のプログラムを作りましたよ!

libopenzwave.so.1.4 libにロードに失敗しました:共有オブジェクトファイルを開くことができません。

つ迅速SYMリンク後にそのようなファイルや ディレクトリを、そのすべての作品:)

+1

一般に、バージョン管理されていないものではなく、バージョン管理されたSONAMEからロードしたいとします。ほとんどのディストリビューションは、1.2に大きな変更がなければ、libfoo.so.1.1 - > libfoo.so.1.2のようなsymlinkを実行します。 libfoo.so.1.1は、使用しているAPIセットなので、参照する必要があります。 – bartonjs

関連する問題