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

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

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

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

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

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

A 回答 (2件)

ちなみにどういうエラーが出ていますか?


ライブラリが見つからないと言うことなら、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 <実行ファイル>で確認できます。
    • good
    • 1
この回答へのお礼

よく見るとタイプミスでした。
全角スペースが入っておりそれで動かなかったようです。
ありがとうございます。

お礼日時:2008/09/20 23:34

export LD_LIBRARY_PATH=/usr/local/lib


としても、エラーを吐かずに動きますか ?

この回答への補足

export LD_LIBRARY_PATH=/usr/local/lib
を実行すると、LD_LIBRARY_PATHが組み込まれるので動きだします。
ただ、再起動をすると、消えてしまうみたいでもう一度設定する必要があるみたいなのです。

そこで、
echo "/usr/local/lib" >> /etc/ld.so.confに記述し、ldoconfigでキャッシュを作っておけば再起動してもライブラリパスが飛ばないかなとおもったんですがエラーを吐いて動かないのです。

bashrcに記述しておけば、問題の解決にはなるのですが、
export LD_LIBRARY_PATH=/usr/local/libを、bashrcに書くのはよくないという記事を見たのでできるだけ、
echo "/usr/local/lib" >> /etc/ld.so.confでしたいと考えたのです。

私の中では、LD_LIBRARY_PATHも/etc/ld.so.confも 
ライブラリパスの検索場所を記述しているものだと思っているのですが
二つのコマンドの意味はひょっとして違うのでしょうか?

補足日時:2008/09/20 01:11
    • 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が設定されている場合はこちらが使用されます。

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

QPATHとLD_LIBRARY_PATHの設定

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による)などで
固定で設定する場合、注意することはありますか?
個人的に思っているのは、パスの先頭に追加すると既存サービスなどに影響を与える可能性があるので、
最後尾に追加していくことぐらいです。


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

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は未設定というような状態のこと...続きを読む

Aベストアンサー

> ソースインストールする際に、事前に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を
使うのが望ましいでしょう。

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

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

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

ただし、インストール時に実行時パスが設定されている(リンカオプションの-Rまたは
...続きを読む

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です。

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

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

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

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

Aベストアンサー

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

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

Qsocket: recvはいつ,どれだけ受け取るのか?

 現在,参考書にしたがってC++でソケットプログラミングを書いています.

 sendとrecvを非同期にするために,本では select関数やWSAAsyncSelect関数などを利用していて,実際,本のとおりに書いて上手く動いています.

 ここで伺いたいのですが,recvは,どうやって「データが届いたか」を知るのでしょうか.

 同期ならば,トランシーバでの会話のように送信側が「どうぞ」といって送受信を交代させることができますが,非同期ならばそれができません.

 NICとかが,プログラムに「届いたぞ!( or これから届くぞ!)」と教えてくれるのでしょうか.あるいは逆に,プログラムがNICに「届いてる?」と聞いているのでしょうか.仮に,ここに書いたような方法で届いたことが分かったとしても,どれくらい受け取ればいいかは分かりません(それも併せて教えてもらっているのでしょうか.データを送るときには,どれだけ送ればいいか分かりますよね.受信するときはどうしてるのかを知りたいと思っています).

Aベストアンサー

Linux しか知らないので Linux で説明をします。

NIC が通信パケットを受け取ると割り込みが発生し、CPU は割り込みを受け付けて、対応するデバイスドライバを起動します。この時、ドライバはソケットバッファと呼ばれる構造体にパケットの中身をコピーして、Linux カーネルの本体に渡し、そこで TCP 等の上位プロトコル処理が行われます。

一方、ユーザプログラムの方は、 select() なり read() で待っている訳ですが、OS はもちろんプロセスが何を待っているかを知っているので、対応する待ちの条件が満たされると、この場合は select() や read() が、抜けてくる(return する)訳です。

という事で、ユーザのプログラムは select() なり read() なりで受信データを「待つ」ことが必要です。もちろん select() や read() が呼ばれた時点で既に受信しているのならば、それらは直ぐに帰ってきます。read() や recv() はデータが届いた事を知る、というよりは、届いているかチェックして、まだ届いていなければ届くまで待つ(read() が抜けてこない)という処理になります。また NIC とユーザプログラムが直接やり取りをするのではなく、間にバッファがあって、対応するソケットのデータがある(受信済み)/ないか(未受信)、という問い合わせを行っているだけです。

ソケットの場合、データの送受信は非同期であり、送受信のタイミングのずれは(ソケット)バッファである程度吸収されます。もちろん、送受信バッファが満杯になった場合は流量制御が働いて、結果的に送信側の write() や send() が待ちに入ることになります。

Linux (Unix) のソケットの受信では、read() 等で指定されたバッファが常に満杯で返されるとは限らない設計になっています。つまり、その時に受信しているデータを返すだけなので、read() で返されたバイト数を必ず見ないと間違った動きになるので注意してください。

Linux しか知らないので Linux で説明をします。

NIC が通信パケットを受け取ると割り込みが発生し、CPU は割り込みを受け付けて、対応するデバイスドライバを起動します。この時、ドライバはソケットバッファと呼ばれる構造体にパケットの中身をコピーして、Linux カーネルの本体に渡し、そこで TCP 等の上位プロトコル処理が行われます。

一方、ユーザプログラムの方は、 select() なり read() で待っている訳ですが、OS はもちろんプロセスが何を待っているかを知っているので、対応する待ちの条件が満...続きを読む

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 を読んで不明点があればその情報に限って検索するのがいいと思います。

Q~以外を削除する場合(rmコマンド)

linuxのコマンドで
~以外のファイル、ディレクトリを全て削除したい時は
どのような記述をすれば良いのでしょうか?
シェルスクリプトではなくrmコマンド1つで削除したのいですが…

例: tar以外のファイル・ディレクトリを
   すべて削除したい場合など

どなたかご存知の方がいらっしゃったら
教えてください。よろしくお願い致します。

Aベストアンサー

rm コマンドのみという訳にはいきませんが基本的なコマンドを組み合わせると実現可能と思います。

「名前が tar で終わるもの以外のファイル・ディレクトリを削除する」場合だと

ls | grep -v -E 'tar$' | xargs rm -r

となります。

ファイルの一覧を取得し ( ls )
'tar'で終わるもの以外を抽出し ( grep )
その結果を rm -r の引数に指定して実行 ( xargs )

という流れです。

ファイルを削除するような操作については失敗するとダメージが大きいので、事前にテストして動作を確認すると良いとおもいます。また rm -r -i としてそれぞれのファイルについて、削除の問い合わせをするのも有効です。

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

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

教えて下さい。

Aベストアンサー

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

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

Qubuntu8.0.4にopenssl-develをインストールしたい

ubuntu8.0.4にopenssl-develをインストールしたいのですが
sudo apt-get install openssl-devel
と入力してもインストール出来ません。
opensslはインストールしたりアンインストールしたり出来ますが。
何かちがうのでしょうか?

/etc/apt/source.list
を変更しないとだめなのでしょうか?
もともと無いとか?
情報お持ちの方、お力をお貸し頂けたら幸いです。
よろしくお願い致します。

 

Aベストアンサー

今ちょうど、Ubuntu をいじっているので

無いものは、install 出来ないかと
libssl , libssl-dev ならありますが

devel は、fedora などで
Deb系 は、 xxx-dev だと思いますが

QC言語の配列をC++のvectorに高速に変換したい

質問は表題のとおりです。
単純な方法では以下の通りになると思いますが、
(C言語文字列から string への変換のように)
一括変換の仕組みは vector にないのでしょうか?
static const int n=5;
int a[n]={0,1,2,3,4};
std::vector<int> v(n);
std::vector<int>::iterator vit=v.begin();
for(int i=0; i<n; i++){
*vit++ = a[i];
}

上記の例では n=5 ですが、nがとても大きな場合に適用したいと考えています。
ちなみに、gcc 3.4.3 を使っています。

Aベストアンサー

> C言語の配列に関して、STL のアルゴリズム(binary_searchなど)を
> 使いたいと考えているのですが、
それなら素直にこうすればよいのではないの?

--------------------
#include <algorithm>
#include <iostream>
int main(){
  using namespace std;
  static const int n=5;
  int a[n]={0,1,2,3,4};

  cout << binary_search(a, a+n, 3) << endl;
  cout << binary_search(a, a+n, 6) << endl;

  return 0;
}


人気Q&Aランキング