こんにちは。
本日は、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] こんばんは!!
変更が反映されましたね。
以上です。