共有ライブラリについて質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
pocket
記事: 49
登録日時: 9年前

共有ライブラリについて質問

#1

投稿記事 by pocket » 9年前

お世話になっております.


今回共有ライブラリを使ったプログラムを作成したいと思い,
サンプルを作りましたがうまくいきませんでした.
以下に詳細を記載します.

ldd.h

コード:

#ifndef H_LDD_H
#define H_LDD_H
void say();
#endif
ldd.hpp

コード:

#include "ldd.h"
#include <iostream>
void say(){
  std::cout<<"hello"<<std::endl;
}
ldd_sample.cpp

コード:

#include"ldd.h"
#include <iostream>
int main(){
  say();
}
実装環境
VMWare Lubunt
コンパイル
% g++ -shared -fpic -x c++ ldd.hpp -o libldd.so
% g++ ldd_sample.cpp -lldd -L .
実行結果
% ./a.out
./a.out: error while loading shared libraries: libldd.so: cannot open shared object file: No such file or directory
% ldd a.out
linux-vdso.so.1 => (0x00007ffd15356000)
libldd.so => not found
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007efef38e3000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007efef3519000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007efef3211000)
/lib64/ld-linux-x86-64.so.2 (0x00007efef3bf2000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007efef2ffb000)

ldd_Sampleからsay()関数を実行したいです.
ですが,上記の結果を見ていただければ分かるように,
libldd.so => not found
となっています.

この対処法を調べましたところ,LD_LIBRARY_PATH環境変数を設定すればいいということでした.
ですので,libldd.soがあるフォルダを設定しました.
% echo $LD_LIBRARY_PATH
/home/myname/Desktop/c++_sample

ですが,ldd a.out の結果は変わりませんでした.
自分では何が問題なのかが分かりません.

皆さんのお力をお借りいただければ幸いです.
よろしくお願いいたします.

sleep

Re: 共有ライブラリについて質問

#2

投稿記事 by sleep » 9年前

「/home/myname/Desktop/c++_sample」に 「libldd.so」ファイルが存在しないとしか思えません。
以下を確認してみてください。

①: 本当に「/home/myname/Desktop/c++_sample」に 「libldd.so」ファイルはありますか?
$ ls /home/myname/Desktop/c++_sample | grep libldd.so

②: libldd.so と a.out を同じディレクトリに配置して以下のコマンドで実行できますか?
$ LD_LIBRARY_PATH=. ./a.out

③: ①と②が真だった場合、以下で実行できますか? (a.out を配置しているディレクトリで実行してください)
$ export LD_LIBRARY_PATH="/home/myname/Desktop/c++_sample"
$ echo $LD_LIBRARY_PATH
$ ldd a.out
$ ./a.out

④: ①が真、③が偽だった場合、LD_LIBRARY_PATH をどうやって(もしくはどこに記述して)設定したのか教えてください。

pocket
記事: 49
登録日時: 9年前

Re: 共有ライブラリについて質問

#3

投稿記事 by pocket » 9年前

sleep さん

返信ありがとうございます.
ご指摘いただきました項目について,
回答させて頂きます.

1.ldd.soが存在するのか
% ls /home/myname/Desktop/c++_sample | grep libldd
libldd.so

存在しました.

2.同じディレクトリにおいて実行できるのか
% LD_LIBRARY_PATH=. ./a.out
hello

無事実行できました.

3.提示していただきました方法で実行できました.

今回の問題の原因は,シェルの変数の設定を
LD_LIBRARY_PATH=/home/myname/Desktop/c++_sample
としているだけで,exportをしていませんでした.

問題は解決したのですが,最後にひとつ質問させていただきたいです.

コード:

LD_LIBRARY_PATH=. ./a.out
このコマンドはどういう意味でしょうか?
変数の設定かと思いましたが,a.outも実行されていましたので,
疑問に思いました.

回答いただければ幸いです.
よろしくお願いします.

sleep

Re: 共有ライブラリについて質問

#4

投稿記事 by sleep » 9年前

pocket さんが書きました: 問題は解決したのですが,最後にひとつ質問させていただきたいです.

コード:

LD_LIBRARY_PATH=. ./a.out
このコマンドはどういう意味でしょうか?
envコマンドです。
$ env LD_LIBRARY_PATH=. ./a.out

bashでは、envコマンドは省略して記述することができます。

pocket
記事: 49
登録日時: 9年前

Re: 共有ライブラリについて質問

#5

投稿記事 by pocket » 9年前

sleep さん

回答ありがとうございます.

Linuxに関して知識が不足しているということを感じました.

今後も勉強していきたいと思います.

閉鎖

“C言語何でも質問掲示板” へ戻る