外出自粛中でも楽しく過ごす!QAまとめ>>

solarisまたはlinuxで、ソースインストールする際のPATHとLD_LIBRARY_PATHについての質問です。

1.
ソースインストールする際に、事前にPATHやLD_LIBRARY_PATHを設定してから、
./configure → make をするよう説明しているサイトがありますが、
インストールするときだけPATHやLD_LIBRARY_PATHを変更しても問題ないのでしょうか?

たとえば、インストール時に$ export LD_LIBRARY_PATH=/lib:/usr/libとしてインストールしたけど、
実際にサービスを起動する際はLD_LIBRARY_PATHは未設定というような状態のことです。


2.
ソースインストールする際、./configureとmakeを実行する一般ユーザのPATHやLD_LIBRARY_PATHの示すパスと、
make installを実行するrootユーザのPATHやLD_LIBRARY_PATHの示すパス(または順番)が異なっていても大丈夫でしょうか?

たとえば、一般ユーザはLD_LIBRARY_PATH=/lib:/usr/libだけど、
rootユーザはLD_LIBRARY_PATH=/usr/local/lib:/lib というような状態のことです。


3.
exportなどによる一時的な設定ではなく、profieや/etc/ld.so.conf(solarisではcrleによる)などで
固定で設定する場合、注意することはありますか?
個人的に思っているのは、パスの先頭に追加すると既存サービスなどに影響を与える可能性があるので、
最後尾に追加していくことぐらいです。


以上です。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

> ソースインストールする際に、事前にPATHやLD_LIBRARY_PATHを設定してから、


> ./configure → make をするよう説明しているサイトがありますが、
> インストールするときだけPATHやLD_LIBRARY_PATHを変更しても問題ないのでしょうか?

インストールアプリによります。

/libまたは/usr/lib以外の場所にインストールされたライブラリとリンクされた場合、
基本的には実行するときもLD_LIBRARY_PATHの設定が必要になります。

ただし、インストール時に実行時パスが設定されている(リンカオプションの-Rまたは
環境変数LD_RUN_PATHが設定されている)場合には、実行ファイルにライブラリ検索パスが
追加されるため、実行時にLD_LIBRARY_PATHの設定が必要ありません。

拡張子が.laのファイルがインストールされている場合は自動的に実行時パスが追加
されることがほとんどですが、zlibやopensslのライブラリのようにlibtoolを使用しない
アプリケーションのライブラリとリンクする場合にはconfigure完了後にconfig.status
を編集して自分で実行時パスを追加する必要があります。

# configureが終わったら、config.statusを開いて、例えばzlibであれば -lz と
# いう箇所を -lz -R/usr/local/libのように書き換えて ./config.status を実行し、
# その後 make する

> ソースインストールする際、./configureとmakeを実行する一般ユーザのPATHや
> LD_LIBRARY_PATHの示すパスと、
> make installを実行するrootユーザのPATHやLD_LIBRARY_PATHの示すパス
> (または順番)が異なっていても大丈夫でしょうか?

アプリケーションにも依ります。makeやmake install時にLD_LIBRARY_PATHが必要な
アプリケーションはほとんど無いと思います。

> exportなどによる一時的な設定ではなく、profieや/etc/ld.so.conf(solarisでは
> crleによる)などで固定で設定する場合、注意することはありますか?

認識されていることが全てでしょう。

よくWebを見ていると、Linux向けのサイトで/etc/ld.so.confに追加するような
記述があり、ミッション・クリティカルなシステムでもそれを真似ているケースも
散見されますが、OS全体に影響を与え下手するとOSの動きが変わってしまうリスク
さえあります。なので、できるだけ設定すべきではないでしょう。ましてや先頭に
追加するのはもってのほかです。極力影響度が少ない実行時パスやLD_LIBRARY_PATHを
使うのが望ましいでしょう。
    • good
    • 0
この回答へのお礼

丁寧な説明ありがとうございました。
おかげでいくつかの疑問が解消されました。
まだ自分自身、しっかりとした認識ができていませんが、説明の中で出てきた
単語をヒントにさらに調べてみたいと思います。

お礼日時:2011/07/13 18:23

(1),(2)


ちょっと冷静に考えれば、「必要なライブラリやコマンドが見付からない可能性がある」という致命的な問題があることがわかると思うのですが。

この回答への補足

その問題について悩んでいます。

サービスを実行するユーザ(多くはrootだとも思いますが)のPATHとLD_LIBRARY_PATHが示すパスは、makeまで実行する一般ユーザのそれを含んでいなければならないということになるのでしょうか?

そうでなければ、makeした時点で、ライブラリ等のパスが絶対パスでコンパイルされるのではないか?とも思っています。

補足日時:2011/07/10 00:50
    • good
    • 0

なぜ、この投稿にスレが付かないか、考えて、分析してから、これを読んでください。



1番の答え。

未経験者の発言。机上で質問(当たり前か=頭の中だけで考えていると言う意味)であるので、なぜ、こんな変な質問をだしてくるのか。みなさん、釣りと思ってしまう。


2番の答え。

これも1番と同じ。

3番の答え。

言っている事が意味不明。


全体として、ちゃんと、意味を分かって物事をすすめるようにしましょう。

LD_LIBRARY_PATHが何を意味するのか、pathとは何か、何のために環境変数があるのか?

一般ユーザーと、開発環境は違うの当たり前。最終ビルドして、他人に渡すわけだから(そのように考える事)、その環境で動作するように、設計、構築してください。

ちなみに「export」とはexportコマンドの事を指すのですか?

この回答への補足

詳しい人からしてみれば未経験者ですが、あなたからしてみればそういう人は質問してはダメなんですね。

補足日時:2011/07/10 00:39
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLD_LIBRARY_PATHって?

環境変数で「LD_LIBRARY_PATH」というのがあるかと思うのですが、この変数はOSが使用する変数なのでしょうか?それとも単一、あるいは複数のアプリケーションソフト(ORACLEなどのような)が使用する変数なのでしょうか?
基本的な質問で申し訳ありませんが、教えてください。

Aベストアンサー

OSが使用する変数です。リンク時または実行時にリンクする共有ライブラリを探すために使用されます。

LD_LIBRARY_PATHが設定されていない場合、ダイナミックローダーは/libや/usr/lib等に存在するライブラリを検索しますが、それ以外の場所に存在するライブラリを見つける事ができません。

実行プログラムが32ビットの場合はLD_LIBRARY_PATHが、64ビットの場合でLD_LIBRARY_PATH_64が設定されている場合はこちらが使用されます。

なお、リンク時パスや実行時パスはコンパイル時に設定することもできます。

QLinuxのgccのインクルードパス?

Linuxのgccで、インクルードファイルやライブラリのパスを設定する方法が知りたいのですが、gccについて詳しい書籍やサイトがありましたら、教えてください。

gccとccの違いも知りたいです。

例)
#include "example.h"

このままだと、example.hが無いと表示されます。

Aベストアンサー

標準ライブラリのパスは、gccのインストール時に指定して、Cプリプロセッサの中に組み込まれます。

#include "example.h"
は、まずカレントディレクトリを探し、次に gccコマンドラインの -I オプションで指定したディレクトリを探し、最後に標準ライブラリが探されます。

#include <example.h>
は、カレントディレクトリを探さない点が異なります。

ccも基本的には同じですが、Unixの種類によって機能が異なる可能性があります。Linuxの場合はcc=gccです。

Qld.so.confとLD_LIBRARY_PATH

環境は、debianEtchなのですが
(1)LD_LIBRARY_PATH=/usr/local/lib
(2)echo "/usr/local/lib" >> /etc/ld.so.conf
 ldconfig

と2通りの設定で実験をしたのですが、
(1)の設定ではプログラムがエラーを吐かずに動く。
(2)の設定では、プログラムがエラーを吐いて動かない。

(1)と(2)の設定では、何が違うのでしょうか。
私の考えではライブラリの検索場所を探してるという同じ位置づけなのです。

どなたかご存知の方がいられましたらご教授のほうお願いします。

Aベストアンサー

ちなみにどういうエラーが出ていますか?
ライブラリが見つからないと言うことなら、ld.so.confに書き込んだものが間違っているような気がします(タイプミスとか?)。
ライブラリが見つかっているけど、関数等が見つからないのでしたらld.so.confの一番最後に/usr/local/libが書き込まれているので、別にインストールされたライブラリがリンクされていると思われます。この場合は、/etc/ld.so.confをエディタで修正して、/usr/local/libを一番最初にすれば良いと思います。LD_LIBRARY_PATHに設定されたパスはld.so.confよりも先に探しますので、同一名のshared libraryがある場合は順序も考える必要があります。

どのモジュールをリンクしているかはldd <実行ファイル>で確認できます。

QLinuxのgccのLIBパス? (類似質問)

Linuxのgccで、LIBのパスを設定する方法が知りたいのですが、gccについて詳しい書籍やサイトがありましたら、教えてください。

例)gcc -I/usr/local/example/include test.c

/tmp/ccOFpCBo.o(.text+0x26): In function `main':
: undefined reference to `EXAMPLE_1'
/tmp/ccOFpCBo.o(.text+0x37): In function `main':
: undefined reference to `EXAMPLE_2'
/tmp/ccOFpCBo.o(.text+0x48): In function `main':
: undefined reference to `EXAMPLE_3'
collect2: ld はステータス1で終了しました。



また、ldとはVC6++でいう LINKのことでしょうか?

Aベストアンサー

>また、ldとはVC6++でいう LINKのことでしょうか?
そうです。

コンパイルは正常に終了していて、リンクでシンボルが見つからないというエラーですね。リンクしたいモジュールが /usr/local/example/lib/libmylib.a に入っているとしたら、
gcc -I/usr/local/example/inlude -L/usr/local/example/lib -lmylib test.c
パスと、ファイル名(から先頭のlibを除いたもの)を別々に指定します。

>gccについて詳しい書籍やサイトがありましたら
まず、man gcc を読んで不明点があればその情報に限って検索するのがいいと思います。

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

QUNIX上のプログラムで使うライブラリの中身を知る方法

過去にUNIX上で動作するプログラムを作成していて、その中で多数の.aや.so(標準では無く、オリジナルのもの。)を使っているのですが、.aや.so内にどのような関数があるのか、もしくはそのライブラリに関係するソース名は何か知る手段ってありませんか?
かなり前のものなので、関数仕様書もmakefileも無いため、何をライブラリとしているのか分からず困っています。
駄目もとで、バイナリエディタで中身を確認してみたのですが、何処の情報がそれを示しているかいまいち分かりませんでした。

Aベストアンサー

No.2 の方がご回答されているように、nm コマンドを使えばシンボルの一覧を表示できます。

(ex.1)
$ nm /usr/local/lib/libssl.so
U ASN1_INTEGER_get
U ASN1_INTEGER_set
U ASN1_check_infinite_end
U ASN1_dup
U ASN1_get_object
U ASN1_object_size
U ASN1_put_object
U BIO_callback_ctrl
U BIO_copy_next_retry
U BIO_ctrl
U BIO_f_buffer
00027db0 T BIO_f_ssl

ただし、U となっているものはライブラリ内で未定義のシンボル (変数や関数) であり、他のライブラリによって解決されなければならないものだったと思います。

また、ライブラリが strip コマンドによって strip されてしまっている場合はシンボルテーブルが削除されてしまうため確認できません。

(ex.2)
$ nm /usr/lib/libstdc++.so.5
nm: /usr/lib/libstdc++.so.5: シンボルがありません

No.2 の方がご回答されているように、nm コマンドを使えばシンボルの一覧を表示できます。

(ex.1)
$ nm /usr/local/lib/libssl.so
U ASN1_INTEGER_get
U ASN1_INTEGER_set
U ASN1_check_infinite_end
U ASN1_dup
U ASN1_get_object
U ASN1_object_size
U ASN1_put_object
U BIO_callback_ctrl
U BIO_copy_next_retry
U BIO_ctrl
U BIO_f_buffer
00027db0 T BIO_f_ssl

ただし、U となって...続きを読む

Qapt-get install ****** でinstallしたものをuninstallするには?

御世話になります。
vncserverだけをinstallするつもりが
誤って
apt-get install vncとうってしまいました。
これをuninstallしたいのですが
どのようにすればよろしいでしょうか?

教えて下さい。

Aベストアンサー

# apt-get remove パッケージ名
では、設定ファイルは削除されずに残ります。

完全に削除するときは、
# apt-get --purge remove パッケージ名
です。

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qmakeコマンドのエラーについて(

UNIX(Linux)系のOSやC言語には不慣れなのですが、よろしくお願いします。

普段はWindows7(Home Ed.)を利用しているのですが、
いくつかのlinux系のソフトを利用する際にcygwinも利用しています。


==========================================================
cygwinにソフトウェアをインストールしようとする際に、
ときどき遭遇するエラーなのですが

仮にsoftware.tar.gzというソースファイルからインストールしようとして、

> gunzip -c software.tar.gz | tar xvf -
> cd software
> ./configure
> make
.....
make: *** [all-recursive] error

というエラーが生じて、makeが通らない時があります。
=========================================================


これまで何度か、どういうエラーなのか調べようとする度に挫折し、
何回かやり直している内に、たまたまmakeがすんなり通って
インストールできてしまったりしていたので、
なんとなくうやむやにしていました。

そもそも、この"all-recursive"に全くピンとこないのですが、
これはどういった場合に生じるエラーを示しているのでしょうか?
recursive(再帰的な)だから、関数かなにかの呼び出しに失敗している、
とかそういうことなのでしょうか?


エラーの内容はケースバイケースだし、
漠然とした質問になって申し訳ないのですが、
ちょっとしたアドバイスでもいいので、ご回答をお願いします。

UNIX(Linux)系のOSやC言語には不慣れなのですが、よろしくお願いします。

普段はWindows7(Home Ed.)を利用しているのですが、
いくつかのlinux系のソフトを利用する際にcygwinも利用しています。


==========================================================
cygwinにソフトウェアをインストールしようとする際に、
ときどき遭遇するエラーなのですが

仮にsoftware.tar.gzというソースファイルからインストールしようとして、

> gunzip -c software.tar.gz | tar xvf -
> cd software
> ./configure
> make
...続きを読む

Aベストアンサー

お腹痛いのに、一生懸命違うところを診察しているようなものですかね。

make[2]: *** [tvsetf.o] Error 1
この行より上全部じゃないですか?
WARNINGとかも出てますしね。

仰るとおりケースバイケースではありますが、例えば自分で作ったプログラムでの話ならばプログラムのミスが考えられますが、どこかの出来合いのフリーウェアをmakeしてエラーで落ちる場合は、環境が整っていない場合があります。(○○がインストールされていないとか…)

その辺は全てconfigureやmake時に出てくるメッセージをちゃんと見ることです。

なぜ最後に出てくるall-recursiveだけに注目してるのか知りませんが、見なくてもいいものをずっと見ていても問題は解決しません。

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報