2017-09-26 10 views
2

C++プログラムでダイナミックライブラリを構築して使用する方法を学びたいと思っています。私がTerminalから起動すると、すべてがうまく動作し、プログラムがうまく動いています(私はMac OS X El Capitan上にいます)。驚いたことに、実行可能ファイルをクリックして起動しようとすると、そうではありません。私はdyld: Library not loaded: liblibrary.soReason: image not foundエラーが発生します。ターミナルからでもプログラムを実行することができません

すべてのファイルは、同じレパートリーにあります。私はコマンドでそれらを構築します:

g++ -c -fPIC A.cpp 
g++ -c -fPIC B.cpp 
g++ -shared -fPIC A.o B.o -o library.so 
g++ main.cpp library.so -o Program 

ありがとうございました。

私は次の解決策を試してみました:

  • は、ライブラリの拡張子を変更
  • LD_LIBRARY_PATHDYLD_LIBRARY_PATHの両方で、PATHを追加:library.soまたはlibrary.dylib
  • をRPATH g++ main.cpp library.so -Wl,-rpath,. -o Programg++ main.cpp library.so -Wl,-rpath,$HOME/my_dir -o Program
+2

コマンドラインから実行すると、 'library.so'ファイルと同じディレクトリにいますか?だからあなたの*現在のディレクトリ*にあるので、システムはライブラリを見つけることができます。現在のディレクトリ*になければ、システムはライブラリがどこにあるかを見つける必要があります。これは['-rpath'](https://en.wikipedia.org/wiki/Rpath)**リンカ* *オプション。 –

+1

ところで、メインアプリケーションは '-fPIC'オプションでビルドする必要はなく、ライブラリだけをビルドする必要はありません。 –

+0

はい私はカレントディレクトリにいましたが、以前は 'g ++ -Wl、-rpath、 'を試しました。 main.cpp library.so -oプログラムは現在のディレクトリにリンクし、何も変更されませんでした。 – kipgon

答えて

1

は最後に、私は解決策を見つけました。実際には、動的ライブラリの作成はmacOSとは異なります。私が最初から試したのはLinuxのためだけでした。

だから、マック・ソリューションは以下のとおりです。

  • -dynamiclib-sharedのためのMacと同等です:

    g++ -dynamiclib -install_name "absolute_path/library.dylib" A.o B.o -o library.dylib 
    

  • -install_name "absolute_path/library.dylib"library.dylibを使用するために必要なリンカのエイリアスをlibrary.dylibにします。その後

、伝統的なコマンド:main.cpplibrary.dylibが同じディレクトリにある場合

g++ main.cpp library.dylib -o Program 

は、実行可能ファイルを作成します。

library.dylibが同じ場所にある限り、プログラムはシステム内のどこでも使用できます。 @Ssswiftのコメントに続いて

、リンクの相対パスは、コマンドを使用して達成することができます:

g++ -dynamiclib -install_name "@executable_path/library.dylib" A.o B.o -o library.dylib 

ライブラリーは、その後、実行可能に従うことができます。

ありがとうございました。

3
を追加します。

明示的に指定する必要がありますrpath(絶対値としてコンパイル時に(例えば相対パスではなく、パス)。 g++ -Wall -Wl,-rpath,$HOME/yourdir main.cpp library.so -o Program)、またはDYLD_LIBRARY_PATHを設定してください(thisを参照)。接尾辞は.dylibでなければなりません。.soではありません。

(私はこれ以上の任意のMacOSXを持っていないので、私は詳細を忘れてしまった)

+0

私はこれらのすべてのソリューションを試しましたが、私のために働いたものはありませんでした。 – kipgon

+0

質問を編集して、正確に何が試されたかを説明してください –

関連する問題