なんだか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] こんばんは!!

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



以上です。

【Python】クラス定義

こんにちは。
本日は、Pythonメモです。

定義方法

一番シンプルな定義は以下です。
以下は、中身のないクラスを定義しています。

class MyClass():
    pass

インスタンス化は、クラス名()とします。

m = MyClass()


docstring

クラスのdocstring(ドキュメンテーション文字列)は以下のように記載します。

class MyClass():
    """Sample Class"""
    pass

docstringを取得するには、__doc__を使用します。

m = MyClass()
print(MyClass.__doc__)

実行結果は以下です。

Sample Class


クラス変数

クラス変数はクラス名.変数名 で取得できます。
クラス変数は、すべてのインスタンスで共通です。

class MyClass():
    """Sample Class"""

    num = 1000
print(MyClass.num)

実行結果は以下です。

1000

クラス変数は動的に追加もできます。

MyClass.color = 'Yellow'
print(MyClass.color)

実行結果は以下です。

Yellow


インスタンス変数

インスタンス変数はインスタンス名.変数名 で取得できます。
インスタンス変数は、それぞれのインスタンスで固有のデータです。

以下のサンプルは、コンストラクタ(__init__)で設定しています。

class MyClass():
    """Sample Class"""

    def __init__(self):
        self.name = 'Bob'
m = MyClass()
print(m.name)

実行結果は以下です。

Bob

クラス変数同様、動的に追加することも可能です。

m = MyClass()
m.age = 123
print(m.age)

実行結果は以下です。

123


メソッド

メソッドは、第1引数に自クラスのインスタンスを受けます。
第2引数以降に引数を設定します。

class MyClass():
    """Sample Class"""

    size = 0

    def __init__(self):
        self.name = 'Bob'

    def setSize(self, s):
        self.size = s
m = MyClass()
m.setSize(100)
print(m.size)

実行結果は以下です。

100



以上です。

【C】[超入門] 静的ライブラリを作成する

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

概要

C言語の静的ライブラリの作成と
静的ライブラリのリンクを方法について記載します。

動作環境はMacです。


静的ライブラリの作成とリンク

以下のディレクトリ構成とします。

include
 ┗ calc.h
static
 ┗ calc_sum.c
myapp
 ┗ main.c

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

  • calc.h
#ifndef CALC_H
#define CALC_H

extern void sum(int num1, int num2);

#endif // CALC_H
  • calc_sum.c
#include <stdio.h>

void sum(int num1, int num2) {
    int result = 0;
    result = num1 * num2;

    printf("%d * %d = %d\n", num1, num2, result);
}
  • main.c
#include "calc.h"

int main() {

    sum(100, 200);
    return 0;
}
静的ライブラリの作成

static配下のソースから静的ライブラリを作成します。

$ gcc -c calc_sum.c
$ ls
calc_sum.c calc_sum.o
$ ar r libmyapp.a calc_sum.o
ar: creating archive libmyapp.a
$ ls
calc_sum.c calc_sum.o libmyapp.a
静的ライブラリをリンクする

myapp配下のソースをコンパイルして先ほど作成した
静的ライブラリをリンクします。

$ gcc -c main.c -I../include
$ ls
main.c         main.o
$ gcc -o main main.o -I../include -L../static -lmyapp
$ ls
main           main.c         main.o
$ ./main 
100 * 200 = 20000



以上です。