Sign in Join
Wiki copytemporary

Lazarus/FPC Libraries/ja: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-このページでは Lazarus/FPC でライブラリを作成しうる方法やプロジェクト、パッケージでそれらを利用する方法を述べます。
1+**日本語版メニュー**
2+---
3+[[Main Page/ja|メインページ]] \- [[Lazarus Documentation/ja|Lazarus Documentation日本語版]] \- [[Japanese Localization Notes|翻訳ノート]] \- [[Bug Tracking/ja|日本語障害情報]]
4+
5+このページでは Lazarus/FPC でライブラリを作成しうる方法やプロジェクト、パッケージでそれらを利用する方法を述べます。
26
37## 関連項目
48
5-- [[Creating bindings for C libraries/ja]] - C のヘッダファイル (.h) を Pascal のユニットに変換する方法。
9+ * [[Creating bindings for C libraries/ja]] \- C のヘッダファイル (.h) を Pascal のユニットに変換する方法。
610
711## 総論
812
9-静的ライブラリ: デフォルトでは FPC は静的リンクを用いて実行ファイルをコンパイル・リンクします。即ち、リンカはプロジェクトと各パッケージに含まれる全ての .o ファイルをまとめて一つの大きな実行ファイルにします。利点は外部環境への依存性がないことで、欠点は一台のコンピュータにある複数のプログラムがコードを共有できないことです。また、プラグインをロード/アンロードすることもできません。
13+静的ライブラリ: デフォルトでは FPC は静的リンクを用いて実行ファイルをコンパイル・リンクします。即ち、リンカはプロジェクトと各パッケージに含まれる全ての .o ファイルをまとめて一つの大きな実行ファイルにします。利点は外部環境への依存性がないことで、欠点は一台のコンピュータにある複数のプログラムがコードを共有できないことです。また、プラグインをロード/アンロードすることもできません。
1014
11-動的ライブラリ(ダイナミック・ライブラリ): 動的ライブラリの考え方は、ライブラリをプログラム間で共有することで、コードを格納するメモリ領域を節約し、頻繁に利用されるライブラリでは軌道時間を短縮し、プラグインを可能にしようという発想です。動的ライブラリの欠点は、たまにしか利用されないライブラリでは遅くなること、内部構造が複雑になること(これは主にコンパイラ側の課題です)、初期化の方法が異なること(後述)、互換性のある共有コードだけを混用するための version system が必要になることです。
15+動的ライブラリ(ダイナミック・ライブラリ): 動的ライブラリの考え方は、ライブラリをプログラム間で共有することで、コードを格納するメモリ領域を節約し、頻繁に利用されるライブラリでは軌道時間を短縮し、プラグインを可能にしようという発想です。動的ライブラリの欠点は、たまにしか利用されないライブラリでは遅くなること、内部構造が複雑になること(これは主にコンパイラ側の課題です)、初期化の方法が異なること(後述)、互換性のある共有コードだけを混用するための version system が必要になることです。
1216
1317## オペレーティング・システム
1418
15-動的ライブラリ:
16-
17-| **オペレーティング・システム** | **動的ライブラリ** | **静的ライブラリ** |
18-|--------------------------------|--------------------|--------------------|
19-| FreeBSD | .so | .a |
20-| macOS | .dylib | .a |
21-| Linux | .so | .a |
22-| Windows | .dll | .lib |
23-| Haiku | .so | .a |
19+動的ライブラリ:
2420
21+**オペレーティング・システム** | **動的ライブラリ** | **静的ライブラリ**
22+---|---|---
23+FreeBSD | .so | .a
24+macOS | .dylib | .a
25+Linux | .so | .a
26+Windows | .dll | .lib
27+Haiku | .so | .a
28+
2529### FreeBSD
2630
2731### macOS
2832
2933### Linux
3034
31-動的ライブラリのファイル名は常に 'lib'+パッケージ名+'.so'+ヴァージョン という形をとります。例えば: libz.so.1 や libz.so.1.2.2。
35+動的ライブラリのファイル名は常に 'lib'+パッケージ名+'.so'+ヴァージョン という形をとります。例えば: libz.so.1 や libz.so.1.2.2。
3236
33-Linux は環境変数 LD_LIBRARY_PATH に従ってライブラリを検索し、次いで /lib、次いで /usr/lib、最後に /etc/ld.so.conf を見ます。
37+Linux は環境変数 LD_LIBRARY_PATH に従ってライブラリを検索し、次いで /lib、次いで /usr/lib、最後に /etc/ld.so.conf を見ます。
3438
35-Linux 環境下で(FPC で書かれたものではない)他のライブラリとメモリを共有するには(GetMem / FreeMem、string型)、**unit cmem** を用いる必要があります。メモリ割当を行う他のユニットより先にこのユニットの初期化部が呼び出されるように、このユニットは、プロジェクトの主ソースファイル(典型的には .lpr)の uses 節の先頭におくようにします。
39+Linux 環境下で(FPC で書かれたものではない)他のライブラリとメモリを共有するには(GetMem / FreeMem、string型)、**unit cmem** を用いる必要があります。メモリ割当を行う他のユニットより先にこのユニットの初期化部が呼び出されるように、このユニットは、プロジェクトの主ソースファイル(典型的には .lpr)の uses 節の先頭におくようにします。
3640
3741### Windows
3842
39-Windows はカレントディレクトリ、システムディレクトリ、環境変数 PATH で指定されたディレクトリを検索します。
43+Windows はカレントディレクトリ、システムディレクトリ、環境変数 PATH で指定されたディレクトリを検索します。
4044
4145## ppumove, .ppu, .ppl
4246
43-通常の場合、FPC はユニット毎に .ppu ファイルと .o ファイルを一つづつ生成します。**.ppu ファイル**は .pas/.pp ファイルの重要な情報(型、.o ファイルなどの必要なファイル名)を全て含んでおり、一方 **.o ファイル**はアセンブラ・コードと現用のシステム向けに名前修飾された識別子を含んでいます。
44-
45-ツール **ppumove** は全ての FPC インストールパッケージに含まれており、一つまたは複数の .ppu ないし .o ファイルを単一の動的ライブラリに変換します。この機能ははリンカを呼び出すことで行われます。リンカは全ての .o ファイルを集めて一つの .so ファイル(Windows では .dll、Mac OS X では .dylib)にし、.o ファイルへの参照を .ppu ファイルから取り除きます。このようにして作られた新しい .ppu ファイルは普通 **.pplファイル** と呼ばれます。
47+通常の場合、FPC はユニット毎に .ppu ファイルと .o ファイルを一つづつ生成します。**.ppu ファイル** は .pas/.pp ファイルの重要な情報(型、.o ファイルなどの必要なファイル名)を全て含んでおり、一方 **.o ファイル** はアセンブラ・コードと現用のシステム向けに名前修飾された識別子を含んでいます。
4648
47-例:
49+ツール **ppumove** は全ての FPC インストールパッケージに含まれており、一つまたは複数の .ppu ないし .o ファイルを単一の動的ライブラリに変換します。この機能ははリンカを呼び出すことで行われます。リンカは全ての .o ファイルを集めて一つの .so ファイル(Windows では .dll、Mac OS X では .dylib)にし、.o ファイルへの参照を .ppu ファイルから取り除きます。このようにして作られた新しい .ppu ファイルは普通 **.pplファイル** と呼ばれます。
4850
49-パッケージの出力ディレクトリ(.ppu ファイルがある)で、
51+例:
5052
51-```text
52- ppumove -o packagename -e ppl *.ppu
53+パッケージの出力ディレクトリ(.ppu ファイルがある)で、
5354```
55+ppumove -o packagename -e ppl *.ppu
56+```
5457
55-とすると、全ての .ppu ファイルが .ppl ファイルに変換され、一つのファイルlibpackagename.so (Windowsでは: packagename.dll)が生成されます。Linux では、ライブラリファイルの名前の先頭には必ず 'lib' が付けられることを知っておいてください。
58+とすると、全ての .ppu ファイルが .ppl ファイルに変換され、一つのファイルlibpackagename.so (Windowsでは: packagename.dll)が生成されます。Linux では、ライブラリファイルの名前の先頭には必ず 'lib' が付けられることを知っておいてください。
5659
57-こうして生成された新しいライブラリはそのまま C などの他のプログラミング言語から利用することができます。FPC のプログラムからも **external** 修飾子を付ければ利用することができます。しかし、初期化/終了 initialization/finalization セクションが自動的に呼び出されなければなりません。その過程でヒープマネジャの初期化と終了処理が行われるからです。さもないと string型変数も GetMem も使えません。この点 FPC プログラマは甘やかされており(訳注: 何もしないでも初期化/終了処理が自動実行されるから)、もっといい目にあっているわけです。
60+こうして生成された新しいライブラリはそのまま C などの他のプログラミング言語から利用することができます。FPC のプログラムからも **external** 修飾子を付ければ利用することができます。しかし、初期化/終了 initialization/finalization セクションが自動的に呼び出されなければなりません。その過程でヒープマネジャの初期化と終了処理が行われるからです。さもないと string型変数も GetMem も使えません。この点 FPC プログラマは甘やかされており(訳注: 何もしないでも初期化/終了処理が自動実行されるから)、もっといい目にあっているわけです。
5861
5962## dlopen -動的ライブラリのロード
6063
61-動的ライブラリのロードは、**dl ユニット**の中の **dlopen 関数**を利用すると簡単にできます。
64+動的ライブラリのロードは、**dl ユニット** の中の **dlopen 関数** を利用すると簡単にできます。
6265
63-ToDo: 誰か例を付け加えてください
66+ToDo: 誰か例を付け加えてください
6467
65-主な問題は、ファイル名の取得です。ファイル名はヴァージョンとOSに依存します。
68+主な問題は、ファイル名の取得です。ファイル名はヴァージョンとOSに依存します。
6669
6770## 初期化処理
6871
69-それぞれのユニットに、初期化 initialization セクションを一つ含めることができます。初期化セクションが実行される順序は、uses 節でのユニット記述順に従います。
72+それぞれのユニットに、初期化 initialization セクションを一つ含めることができます。初期化セクションが実行される順序は、uses 節でのユニット記述順に従います。
7073
71-How to initialize a dynamic library: ToDo
74+How to initialize a dynamic library: ToDo
7275
7376## 終了処理
7477
75-それぞれのユニットに、終了 finalization セクションを一つ含めることができます。終了セクションが実行される順序は、初期化セクションが実行される順序の逆です。
78+それぞれのユニットに、終了 finalization セクションを一つ含めることができます。終了セクションが実行される順序は、初期化セクションが実行される順序の逆です。
7679
7780## ヴァージョン、配布
7881
79-ライブラリは時の経過とともに育ち、変わっていくものです。新しい機能を付け加えるのは問題がありませんが、パブリックメソッドを削除したり、引数を変更したりすると、ライブラリの互換性が失われます。そうなると、インストール済のライブラリ (.so, .dll, .dylib) を互換性のあるものと置き換えたり、**あるいは**新たなライブラリをシステムに追加したりしないとなりません。これが全てのライブラリにヴァージョン番号が必要な理由です。
82+ライブラリは時の経過とともに育ち、変わっていくものです。新しい機能を付け加えるのは問題がありませんが、パブリックメソッドを削除したり、引数を変更したりすると、ライブラリの互換性が失われます。そうなると、インストール済のライブラリ (.so, .dll, .dylib) を互換性のあるものと置き換えたり、**あるいは** 新たなライブラリをシステムに追加したりしないとなりません。これが全てのライブラリにヴァージョン番号が必要な理由です。
8083
81-**dl ユニット**の中の **dlopen 関数**を用いて動的ライブラリをロードするためには正確なファイル名がわかっていないとなりません。Linux 環境下では、ヴァージョン番号がわかっている必要があるわけです。
84+**dl ユニット** の中の **dlopen 関数** を用いて動的ライブラリをロードするためには正確なファイル名がわかっていないとなりません。Linux 環境下では、ヴァージョン番号がわかっている必要があるわけです。
8285
8386ToDo: proposal how the IDE should create version numbers
8487
8588---
86-*From the Free Pascal wiki, page "Lazarus/FPC Libraries/ja", as it stood on 2021-09-23 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
89+*From the Free Pascal wiki, page "Lazarus/FPC Libraries/ja", as the Internet Archive kept it on 2025-01-18, last changed on 2021-09-24. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history