- ベストアンサー
静的/動的リンクライブラリについて
- Pythonのctypesを使っていて気になったこと
- 静的リンクライブラリ(.lib)の対応についての疑問
- dllとlibの利用可能性についての質問
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
動的ライブラリは本質的に実行可能プログラムです。一部参照が未解決の場合がありますが、それらはローダで解決できるようになっています。Windows DLLの場合、C形式(cdecl)やC++形式(stdcall)といったエントリポイント形式が決まっているので、メモリにロードしてエントリポイントを適切に呼び出せば使えます。 静的ライブラリは機械語プログラムの断片に過ぎません。変数や関数の参照解決ができていませんので、そのままでは実行できず、リンカと呼ばれる開発ツールによって実行可能プログラムに変換しないと使えません。Python実行環境はリンカを内蔵していないので静的ライブラリを使うことはできません。なお、一般的に静的ライブラリの構造は開発ツールにより異なるので、開発ツールごとに個別のリンカが必要です。 # 例えばVisual C++(.lib)とCygwin gcc(.a)では違う
その他の回答 (1)
- kmee
- ベストアンサー率55% (1857/3366)
Python-C APIの資料は読んだことありますか? 例えば http://www.python.jp/doc/release/extending/index.html http://www.python.jp/doc/release/c-api/index.html PythonからCの関数が呼び出せる、といっても、なんでもかんでも使えるわけではありません。 直接呼び出すためには、Pythonの規則にしたがう必要があります。 正に「Cで書いてあるけど、Pythonのモジュール」です。 静的ライブラリというのは、それ単独で利用できるものではありません。リンクして初めて利用できるものです。これは、Pythonだから、というわけではなく、Cでも使う場合でもそうです。 Cで分割コンパイルはやったことありますか?あのときできる .objファイルを一つにまとめただけのものだと考えていればよいです。 Pythonから使おうとするなら、Pythonの実行ファイルをビルドする際に一緒にリンクする、と言った方法でなければ、利用できません。 あるいは、Pythonから呼び出せるDLLをビルドする時に一緒にリンクするか、ですが、これはDLLを作るときに極普通に使われている方法です。 どちらにしても、Pythonから呼び出すための専用の関数の用意も必要です。 # .lib,DLLとあることから、Windowsをお使いと判断しました。
お礼
回答ありがとうございます。 Python-C APIのページは読んだことがなかったです。 Pythonの正体(?)を知らないままなんとなく触っていたもので・・・Python <--> C の間でいろいろできるのも(理屈はさておき)得心できました。 (少なくとも、Windowsの).libの場合は(Cでもやるように)通常通り実行ファイルのビルド時に組み込むしかない、ということですね。 ※そうですね、Windowsです。その辺はLinuxでも良かったのですけど、プラットフォームによる違いは今回そこまで重要でなかったので。 Windows前提で書いたものでしたが、少々言葉足らずでしたね;
お礼
リンクを行う機構が備わっていればPythonでも.libのコードを組み込むことは可能・・・。 ただPythonにはそういうものはないので、やりたければ自分で実装・拡張してくださいよ、と。そして静的ライブラリは形式によって内部の構造も異なるし、動的ライブラリの方が主流(これはどこかのページで見ただけですが)であることからコスト的にもあんまり見合わない。・・・と、私なりに解釈しました。 私が何に疑問を感じていたのか。というのが、寄せられた回答を咀嚼するうちにはっきりしてきた気がします。 が、それはまた別の質問として立てさせていただくことにします。 回答ありがとうございました。