Yabu.log

ITなどの雑記

C言語復習ラスト。ライブラリについて

ライブラリは今までよく知らなかったので、復習ではない気がする。

ライブラリとは

このプロセスの中の .oファイルをまとめてライブラリを作ることができる

$ ar -r mylib.a a.o b.o
ar: creating archive mylib.a

$ ls -alt
-rw-r--r--   1   staff  1768  7 17 00:07 mylib.a
-rw-r--r--   1   staff   748  7 16 19:13 b.o
-rw-r--r--@  1   staff   748  7 16 19:13 a.o

$ ar -t mylib.a 
__.SYMDEF SORTED
a.o
b.o
  • 関数を使うにはプロトタイプ宣言が必要
    • #include<stdio.h>とmain関数の間にある関数の宣言のやつ
      • main関数の手前に関数を定義してしまえばプロトタイプ宣言を書かなくて良いのではないだろうか?(手抜き)
        • この方法を採用すると、呼び出し関係を把握して、関数の依存性を整理して順番に定義する必要がある(非常に手間)
#include<stdio.h>
//このプロトタイプ宣言を入れとけば関数の依存関係は気にしなくて良くなる。
//void a();
//void b();

void a(){
  b();//関数bを呼び出しているが、この呼び出しより上に定義されていないためコンパイルエラー
}
void b(){
  puts("test");
}
int main(){
  a();
}
コンパイルエラー
other/prototype.c:4:3: warning: implicit declaration of function 'b' is invalid in C99
      [-Wimplicit-function-declaration]
  b();
  ^
other/prototype.c:6:6: error: conflicting types for 'b'
void b(){
     ^
other/prototype.c:4:3: note: previous implicit declaration is here
  b();
  ^

mylib.hの内容

void a();
void b();

libtest.cの内容

#include "mylib.h"
main()
{
  a();
  b();
}

もちろんライブラリを利用するプログラムは.hファイルを展開するプリプロセッサを使わなくても 自分でライブラリの中の関数をプロトタイプ宣言に追記すれば利用することができる。ただし、こういうことは面倒なので、基本的には.hファイルを用意して#includeすべき

void a();
void b();
main()
{
  a();
  b();
}

#includeプリプロセッサの利用有無による結果の違い

  • gcc -Eコマンドの結果も大して変わらない

#includeプリプロセッサ利用

$ gcc -E libtest.c mylib.a
clang: warning: mylib.a: 'linker' input unused [-Wunused-command-line-argument]
# 1 "libtest.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 341 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "libtest.c" 2
# 1 "./mylib.h" 1
void a();
void b();
# 2 "libtest.c" 2
main()
{
  a();
  b();
}
$ gcc -E libtest.c mylib.a
clang: warning: mylib.a: 'linker' input unused [-Wunused-command-line-argument]
# 1 "libtest.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 341 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "libtest.c" 2
void a();
void b();
main()
{
  a();
  b();
}

まとめ

ライブラリを作ったなら.hファイルも忘れず作ろう!

おしまい。

プログラミング学習シリーズ C言語改訂版 2 はじめて学ぶCの仕組み

プログラミング学習シリーズ C言語改訂版 2 はじめて学ぶCの仕組み