linuxのenvやexportで設定できるpathと、lnで作るリンクの違いはなんでしょうか?

また、下記のコマンドを実行するとしたらlinux上でどのようにするとよいでしょうか?

Running js-symbolic-executor
You can run the JUnit tests for js-symbolic-executor by invoking

ant test

Currently, there are not many tests, and one of them fails.
You may get UnsatisfiedLinkError exceptions when trying to run the tests. This
is likely because the shared object files that CVC3 created when it was built
are not found by the linker. Ant is able to tell the JVM where to find one of
these files (libcvc3jni.so), but not the other. Two ways to fix this are:

1. Make a link to cvc3/lib/libcvc3.so (or some variant thereof, depending on
your link error) somewhere the linker looks by default, such as /usr/lib

2. Set LD_LIBRARY_PATH to point to cvc3/lib:
LD_LIBRARY_PATH=../cvc3/lib ant test

1.リンクを作成する
リンクを作成するとは具体的にはどういった意味を持ち、どういった作業をするのか

2.PATHを設定する
$export LD_LIBRARY_PATH=../cvc3/lib ant test
$ant test

または

$env LD_LIBRARY_PATH=../cvc3/lib ant test
コマンドで実行すれば問題ないでしょうか?

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2014/11/19 14:28:18
  • 終了:2014/11/19 17:39:53

ベストアンサー

id:JULY No.1

JULY回答回数966ベストアンサー獲得回数2472014/11/19 16:28:08

linuxのenvやexportで設定できるpathと、lnで作るリンクの違いはなんでしょうか?

方や環境変数、方やファイルシステム上の話で、全く別です。

で、具体的な問題は、実行したプログラムが共有ライブラリ(Windows でいうところの DLL)を見つけられない、という話で、その解決方法として、ファイルシステム上でリンクを作るか、LD_LIBRARY_PATH という環境変数で、ファイルの置いていあるディレクトリを指定するか、の2つがあるよ、という事を言っています。

UNIX 系 OS では、実行したプログラムが必要とする共有ライブラリを探す時に、通常は /usr/lib の下などを探しますが、LD_LIBRARY_PATH で探すディレクトリを追加する事ができます。「2. Set LD_LIBRARY_PATH to point to cvc3/lib: 」がこの話です。

リンクを作る方ですが、ファイルの実体は同じものを、全く別のファイル名でアクセスできるようにするものです。UNIX 系 OS では「ハードリンク」と「シンボリックリンク」という2種類のリンク方法があり、シンボリックリンクは、Windows のショートカットファイルに似ています。

ハードリンクに比べて、ショートカットリンクの方が作成に制限が少ないですが、Windows のショートカットファイルと同様、実体のファイルが無くなると、作成したリンクからはアクセス出来なくなる、という事が発生します(ハードリンクの場合は、作成したリンクと元のファイルが対等な関係になるので、そういった事は起きません)。

「1. Make a link to cvc3/lib/libcvc3.so 」は、libcvc3.so というファイルに対するリンクを、デフォルトで共有ライブラリを探す /usr/lib の下に作成することで、見つけられるようになる、という話になります。

1.リンクを作成する
リンクを作成するとは具体的にはどういった意味を持ち、どういった作業をするのか

リンクの作成は「ln」コマンドを使います。シンボリックリンクの方が分かりやすいので、シンボリックリンクファイルを作る方で例を示すと、以下のようになります。

ln -s /usr/local/cvc3/lib/libcvc3.so /usr/lib/

シンボリックリンクを作る場合は「-s」オプションを付けます。上記の例で /usr/lib の下に libcvc3.so というシンボリックリンクが作られ、/usr/lib/libcvc3.so という名前でアクセスできるようになり、実体のファイルは /usr/local/cvc3/lib/libcvc3.so というファイル、という事になります。今、仮にlibcvc3.so が /usr/local/cvc3/lib というディレクトリにあるとして例示しましたが、そこは実際に libcvc3.so ファイルがあるパスを指定して下さい。

ただ、/usr/lib の下にシンボリックリンクを作る、ということは、root 権限を持っていないと作る事が出来ないので、root 権限が使えな無いのであれば、LD_LIBRARY_PATH で指定する方法を取る必要があります。

2.PATHを設定する
$export LD_LIBRARY_PATH=../cvc3/lib ant test
$ant test

exprot LD_LIBRARY_PATH=../cvs/lib とすれば、以降、ログアウトするまで LD_LIBRARY_PATH の設定は有効です。なので、

$ export LD_LIBRARY_PATH=../cvc3/lib
$ ant test

という使い方になります。ただ、相対パスで指定すると、カレントディレクトリが変われば「../cvc3/lib」では目的のディレクトリ辿りつけないことになるので、フルパスで指定した方が良いです。

id:ruzxa

懇切丁寧なご回答ありがとうございます。
とてもわかりやすかったです。


>UNIX 系 OS では、実行したプログラムが必要とする共有ライブラリを探す時に、通常は /usr/lib の下などを探します
>ln -s /usr/local/cvc3/lib/libcvc3.so /usr/lib/
>上記の例で /usr/lib の下に libcvc3.so というシンボリックリンクが作られ、/usr/lib/libcvc3.so という名前でアクセスできるようになり

これらのプロセスを経て

>「1. Make a link to cvc3/lib/libcvc3.so 」は、libcvc3.so というファイルに対するリンクを、デフォルトで共有ライブラリを探す /usr/lib の下に作成することで、見つけられるようになる

ということで理解できました。

windowsの対比や、ハード・シンボリックリンクの具体的な解説、
更にはroot権限を持っていない場合にはPATHを設定する選択肢を選ぶといった使い分け
pathはフルパスで指定した方が良いといった躓きやすい点
までご説明頂き、本当にありがとうございました!

2014/11/19 17:39:39

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません