静的ライブラリとオブジェクトファイルの違いがよくわかりません。
いろいろとウェブ上で検索すると、
静的ライブラリはオブジェクトファイルをまとめたもの
というような説明がよくあるのですが、オブジェクトファイルとの違いは何なのでしょうか。
あるプロジェクトで一つのCのソースファイルに対応する形で静的ライブラリ(.aファイル)が存在しているのですが、このような場合はオブジェクトファイルとの違いはないのでしょうか?
hoge.c hoge.h hoge.a fuga.c fuga.h huga.a
上記のような形になっている場合、.aファイルは必ずしも複数のオブジェクトファイルをまとめたものとは言えないと思うのですが。。。
ご教示いただけますと幸いです。よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
main.c
C
1int main(void) { hoge(); }
hoge.c
C
1void hoge(void) { puts("hoge"); }
fuga.c
C
1void fuga(void) { puts("fuga"); }
.o ファイルを作る
$ gcc -c main.c hoge.c fuga.c
.a ファイルを作る
$ ar r hoge.a hoge.o $ ar r fuga.a fuga.o
実行ファイルを作る
$ gcc -o main1 main.o hoge.o fuga.o
実行ファイルを作る
$ gcc -o main2 main.o hoge.a fuga.a
main1 は、不要な fuga.o もリンクされてサイズが大きくなっています。
main2 は、hoge.o しかリンクされていません。
hoge.o を fuga.o を一つの libhg.a にまとめておけば、
gcc -o main main.o libhg.a だけで、必要な .oファイルだけがリンクされます。
投稿2019/11/20 07:24
編集2019/11/20 07:35総合スコア8224
0
以下参考情報です。Ubuntu 19.04くらいでやってみた結果だけ貼っときます。
lib.h
C
1extern int add(int left, int right); 2extern int sub(int left, int right);
lib.c
C
1#include "lib.h" 2 3int add(int left, int right) 4{ 5 return left + right; 6} 7 8int sub(int left, int right) 9{ 10 return left - right; 11}
main.c
C
1#include "lib.h" 2 3int main() 4{ 5 return add(1,2); 6}
上記を用意し、下記を実行
text
1user@user-pc:~/c/tmp2$ gcc -c lib.c 2user@user-pc:~/c/tmp2$ gcc -c main.c 3user@user-pc:~/c/tmp2$ gcc -o linkwithobject main.o lib.o 4user@user-pc:~/c/tmp2$ ar r libsample.a lib.o 5user@user-pc:~/c/tmp2$ gcc -o linkwithlib main.o -L. -lsample 6user@user-pc:~/c/tmp2$ ls -lAF linkwith* 7-rwxrwxr-x 1 user user 16432 11月 20 16:29 linkwithlib* 8-rwxrwxr-x 1 user user 16432 11月 20 16:28 linkwithobject* 9user@user-pc:~/c/tmp2$ cmp linkwith* 10user@user-pc:~/c/tmp2$ ls -lAF lib.o libsample.a 11-rw-rw-r-- 1 user user 1328 11月 20 16:27 lib.o 12-rw-rw-r-- 1 user user 1476 11月 20 16:28 libsample.a 13user@user-pc:~/c/tmp2$ objdump -t linkwithobject | egrep -e '(sub|add)' 14000000000000113a g F .text 0000000000000014 add 15000000000000114e g F .text 0000000000000012 sub 16user@user-pc:~/c/tmp2$
投稿2019/11/20 07:31
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/20 07:37
退会済みユーザー
2019/11/20 07:46
0
ベストアンサー
どのようなプロジェクトなのでしょう。Windows上のMinGWでしょうか。それともLinux上でgccなどでしょうか。いずれにせよ 1つの*.c ファイルにつき1つの*.aファイルとは、私自身は初めて見る提供形態ですね。どういう意図があったのか、掴みかねています。
一般的に静的ライブラリは「libHoge.a」のように頭に「lib」がつくファイル名で、gcc
のコマンドラインオプションで -lHoge
などと指定してリンクできるようにします。そういうファイル名でもないので、あるいは後で自分でひとつの静的ライブラリにまとめてもらうことも想定しているのでしょうか。(ar
コマンドでまとめることができます)
投稿2019/11/20 06:54
総合スコア9256
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/20 06:56
2019/11/20 07:01
2019/11/20 07:04
2019/11/20 07:08
2019/11/20 07:23
0
オブジェクトはリンクするとすべて取り込まれ、実行イメージとなりますが、
ライブラリはオブジェクトから呼び出されたもののみがリンクされ、使用されないものは出力されません
まあ、ライブラリがその都度すべて取り込まれると、どえらい容量となってしまいますね
投稿2019/11/20 06:37
編集2019/11/20 06:38総合スコア88038
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/20 06:48
2019/11/20 06:51
2019/11/20 06:53
2019/11/20 06:58
2019/11/22 08:48
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/20 07:32