なんだかGoodVibes

日々の勉強メモです。

【C】[超入門] 共有ライブラリと静的ライブラリの変更時の違い

こんにちは。
本日は、C言語メモです。

概要

共有ライブラリと静的ライブラリ、変更が発生した際に
どのような違いがあるのかについて 本記事で記載しようと思います。

動作環境はMacです。


ディレクトリ構成と各ファイル

以下のディレクトリ構成とします。
作成した共有ライブラリ、静的ライブラリはmyappに配置します。

include
 ┗ app_lib.h
lib
 ┣ lib_shared.c
 ┗ lib_static.c
myapp
 ┣ libshared.dylib
 ┣ libstatic.a 
 ┣ main
 ┗ main.c

※ .oファイルは省略

各ファイルの内容は以下です。

  • app_lib.h
#ifndef APP_LIB_H
#define APP_LIB_H

extern void print_static();
extern void print_shared();

#endif // APP_LIB_H
  • lib_shared.c
#include <stdio.h>

void print_shared() {

    printf("[Shared] Hello!!\n");
}
  • lib_static.c
#include <stdio.h>

void print_static() {

    printf("[Static] こんにちは!!\n");
}
  • main.c
#include "app_lib.h"

int main() {

    print_shared();
    print_static();
}

実行ファイルを作成するまでの過程は、
「概要」に記載の過去の記事を参照してください。

【C】[超入門] 共有ライブラリを作成する - なんだかGoodVibes

【C】[超入門] 静的ライブラリを作成する - なんだかGoodVibes


共有ライブラリの内容を変更する

まず、変更前の実行結果は以下です。

$ ./main 
[Shared] Hello!!
[Static] こんにちは!!

では、lib_shared.cの出力部分を以下のように変えてみます。

printf("[Shared] Good evening!!\n");

libshared.dylibをもう一度生成し直して配置し直します。

$ gcc -fPIC -c lib_shared.c
$ gcc -shared -o libshared.dylib lib_shared.o
$ mv libshared.dylib ../myapp/

実行すると、以下の出力になります。

$ ./main 
[Shared] Good evening!!
[Static] こんにちは!!

mainを再度コンパイルしなくとも
出力内容が変更後の値になっています。


静的ライブラリの内容を変更する

先程の続きで進めます。

$ ./main 
[Shared] Good evening!!
[Static] こんにちは!!

では、lib_static.cの出力部分を以下のように変えてみます。

printf("[Static] こんばんは!!\n");

libstatic.aをもう一度生成し直して配置し直します。

$ gcc -c lib_static.c
$ ar r libstatic.a lib_static.o
$ mv libstatic.a ../myapp/

実行すると、以下の出力になります。

$ ./main 
[Shared] Good evening!!
[Static] こんにちは!!

lib_static.cの変更内容が反映されていません。

静的ライブラリの場合、静的ライブラリをコンパイルするだけでは
使用しているモジュールの内容は変更されません。
変更を反映するためには、mainを再度コンパイルする必要があります。

$ gcc -c main.c -I../include
$ gcc -o main main.o -I../include -L. -lshared -lstatic
$ ./main 
[Shared] Good evening!!
[Static] こんばんは!!

変更が反映されましたね。



以上です。