![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
RedHatLinux7.3(2.96-110)、gcc(2.96 20000731)です。
C言語で共有ライブラリを作成しています。このライブラリは呼び出し側のプログラム起動時にロードされるものなのですが、以下の2つの手順で生成されたライブラリは、どのような違いがあるのでしょうか?
どちらも呼び出し側からは関数コールで実行できるのですが、どちらが正しいのでしょうか?
【その1】
1) gcc -shared -o libxxx.so xxx.c (ライブラリ生成)
2) gcc ./libxxx.so -o testcall testcall.c (呼び出し側とライブラリをリンクして実行ファイル生成)
【その2】
1) gcc -fPIC -c libxxx.c(ライブラリのオブジェクト生成)
2) gcc -fPIC -c -shared -Wl,-soname,libxxx.so.0 -o libxxx.so.0.0 xxx.o(共有ライブラリ生成)
3) soname設定
4) linkername設定
5) gcc -c -o testcall.o testcall.c(呼び出し側オブジェクト生成)
6) gcc -o testcall testcall.o -lxxx
7) LD_LIBRARY_PATH設定、exportする
以上、ご存知のかた、どうぞよろしくお願いします。
No.3ベストアンサー
- 回答日時:
いやいやいや。
gcc -shared -fPIC -o libxxx.so xxx.c
gcc ./libxxx.so -o testcall testcall.c
というのならOKです。(-fPICを付けよう!)
ライブラリを直接指定するのはNGじゃありません。
-fPIC 無しだと、ライブラリだけ差し替えたときに
ちゃんと動くのか、怪しげなので。
またまた回答ありがとうございます。
ということは、「呼び出し側アプリ起動時にロードされる共有ライブラリを生成」するには、
>gcc -shared -fPIC -o libxxx.so xxx.c
>gcc ./libxxx.so -o testcall testcall.c
>というのならOKです。(-fPICを付けよう!)
で良い、ということですね?
これならsoname、linkernameの設定も不要ですから、できればこの方法でライブラリを生成したいなぁと思っています。
とりあえず、会社でやってみますね。
またきっと疑問が出てくると思いますので、引き続きよろしくお願いします♪
No.4
- 回答日時:
#1です。
すみません、先ほどは間違ったことを書いてしまいました。その1のやり方でも、soは実行時ロードとなりました。
大変失礼致しました。#1の回答は忘れて戴ければと思います。
ちなみに、私も-fPICは必要と思います。
この回答への補足
onosukeさん、sige_70さん、本当に丁寧な回答をありがとうございました。
おかげさまで、お2人に教えていただいた方法でテストが絶好調ですすんでいます。
これからもペンギンのWebサイトで疑問難問にぶちあたると思いますので、そのときまたどうぞよろしくお願いしま~す♪
ありがとうございました!
また回答ありがとうございます!ということは、
「その1の方法で-fPICをつければ、呼び出し側起動時にロードされる共有ライブラリ」
を生成することができるのですね。
ふぅ~ん、なるほど。でも何故、共有ライブラリ生成は2とおりの方法があるのでしょうね?
soname、linkernameを使うのかどうか?ということだけの違いなんでしょうか?
さ~て、これから-fPICをつけて再テスト開始です!またご報告します。ありがとうございました。
No.2
- 回答日時:
-shared というのは リンク時に 「これから共有ライブラリを作るぞ!」とするオプション。
-fPIC というのは、コンパイル時に 「共有ライブラリで使えるようにコンパイルしろ!」「共有ライブラリ用に使えるオブジェクトファイルを作れ!」とするオプションです。
その1は駄目駄目ですね。
その2 - 2) の -fPIC も必要ないオプションです。
どうせなら、GNUのlibtool使いませんか?
上記と同じことするにも
libtool --mode=compile gcc -prefer-pic -c libxxx.c
libtool --mode=link gcc -version-info 0 -rpath /usr/lib -o libxxx.so libxxx.lo
(soname, linkernameの設定は自動)
libtool --mode=link gcc -o testcall testcall.c libxxx.la
./testcall
(LD_LIBRARY_PATHの設定は自動)
と結構お手軽です。
>その1は駄目駄目ですね。
ありゃりゃ~。ダメダメなんですか・・・。私はてっきり、こっちのほうが手順がらくちんなので、コレでいこう!と思ってました。
>その2 - 2) の -fPIC も必要ないオプションです。
そうなんですかぁ。なにしろLinuxでの開発は初めてなので、ペンギンがウィンクしている日本のLinux情報というWebサイトで情報を拾い集めて奮闘している、という状態なのです。明日、このオプションなしでやってみます。
>どうせなら、GNUのlibtool使いませんか?
そういうものがある、というのは、見かけたことがあります。でも、上記のとおりまるきりのLinuxシロウトが暴れている状態ですので、今からそれを導入するとなると納期に間に合いそうになく、不安が増大してしまいそうです。とりあえず明日から、その2の方法で再テストをやっていきます。またご報告します。そしてまたいろいろ教えてください♪
ありがとうございました!
No.1
- 回答日時:
その1ではライブラリ側のコードが実行モジュールに含まれます。
その2では実行モジュールには含まれず、実行時に動的にsoがメモリにロードされます。
つまり、その1ではso形式にする意味がないということです。
その2では同じライブラリを使用する実行モジュールがたくさんあるとディスク容量を節約できるわけですが、そのライブラリをインストールしていない環境では実行できないと言う欠点があります。
回答ありがとうございます!
>その1ではライブラリ側のコードが実行モジュールに含まれます。
えぇっ?そうなんですか!でも、libxxx.soを変更して実行して、呼び出し側とのリンクを必要とせずにlibxxx.so変更結果が反映されていたのですが、勘違いだったのでしょうかね。明日会社で、も一度確認してみます。
>その2では同じライブラリを使用する実行モジュールがたくさんあるとディスク容量を節約できるわけですが
たくさんあるってワケではないですが、いつなんどきライブラリが呼ばれても実行できるような、マルチスレッド対応はしてあるつもりです。(というふうに作れということなので)
明日また頑張って、その2でやってみます。ありがとうございました♪
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- C言語・C++・C# exeファイルが作れない(windows10) 6 2022/08/13 08:47
- iCloud 【iTunes】CDをiPhoneに取り込めません 2 2022/09/19 09:59
- その他(プログラミング・Web制作) python文字化けエラーが発生しているようです 3 2022/04/13 19:41
- 写真・ビデオ iPhoneのプライバシーとセキュリティの写真の項目について 2 2023/06/24 23:11
- iPhone(アイフォーン) iPhoneのプライバシーとセキュリティの写真の項目について 1 2023/06/24 20:25
- iPhone(アイフォーン) 「ライブラリ」ってどこの事ですか? ※ 英語の勉強のために Amazon で買物をしたいのですが、「 2 2023/07/14 22:04
- 音楽・動画 勝手に別の音楽が流れるアマゾンミュージック 2 2023/07/20 17:12
- Windows 10 外部ドライブにマウントできない問題について 9 2022/03/22 18:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイルで以下のような...
-
逆コンパイルと逆アセンブルの...
-
C言語って古いですか?
-
Windows Formアプリからコンソ...
-
私は
-
Notepad++の関数リスト表示の変...
-
パイソン。If elseの挙動につい...
-
ホワイトハッカーを目指そうか...
-
大量のデータを読み込んで表示...
-
これて逆じゃないですか?
-
C言語について。
-
コンソールアプリを作成するの...
-
0 == False はいいけど
-
プログラム言語について c言語...
-
【C言語】全角文字の配列を、全...
-
C言語初心者 ポインタについて...
-
あんまり考えたくないけど
-
CPUが16bitでも32bitOSでコンパ...
-
VisualStudio2022でC言語プログ...
-
C言語初心者 構造体 課題について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UNIX上のプログラムで使うライ...
-
拡張子.niiのファイルの開き方...
-
Excel VBA のstr()関数でエラー
-
ライブラリ内の処理中における...
-
.NET(C#)でのスタックオーバー...
-
DXライブラリの画像の表示の仕...
-
MakefileのLDLIBSとLOADLIBESの...
-
PHPとMYSQLでトーナメント表作成
-
ライブラリParamQuery gridにつ...
-
pthreadのソースの入手方法
-
openCVの関数の中身を参照する...
-
VC++からExcel制御
-
Googlemapのように画像を拡大・...
-
ogg デコーダエンコーダについて
-
オブジェクトライブラリ
-
CygwinでOpenGLのプログラム中に…
-
動的ロードのメリット
-
OSX写真アプリへの複数のライブ...
-
iTuneライブラリとiPhone,iPod...
-
VC++のCRTの実装を覗き見たい
おすすめ情報