6

dlopen() (Windows では LoadLibrary()) を使用して共有ライブラリを動的にロードする実行可能ファイルを作成しています。共有ライブラリは、実行可能ファイルのシンボルを使用します。

Windows ではこれが可能です。実行可能ファイルはシンボルをエクスポートできます。declspec(dllexport) と .def ファイルの両方が機能します。リンカーは、.exe を作成するときに .lib ファイル (「インポート ライブラリ」) も作成するため、DLL はその .lib とリンクするだけで済みます。

Linux では、これも可能です。実行可能ファイルをビルドするときに -Wl,-export_dynamic を渡し、そのシンボルをエクスポートします。

Mac OS X では、代わりに... -Wl,-export_dynamic は機能しませんが、-Wl,-exported_symbols_list があり<filename>ます<filename>。しかし、共有ライブラリを構築するのはそれほど簡単ではありません。リンカは未解決のシンボルについて文句を言います。

私はハックを試みました:実行可能ファイルの名前を lib <executable>.dylib に変更し、共有ライブラリをリンクするときに -l を渡し<executable>ました。しかし、「メインの実行可能ファイルとリンクできません」というエラーが表示されます。

一般的な問題は、Windows と Mac OS X では許可されていないのに対し、Linux 共有ライブラリには未解決のシンボルが含まれる可能性があることです。しかし、Windows には依存関係に対してシンボルを解決するための「インポート ライブラリ」があり、Mac OS X にはないようです...

これは Mac OS X でどのように解決できますか? 「インポート ライブラリ」に相当するものはありますか (.dll の作成時に Windows リンカによって作成されるスタブ ライブラリです。そのため、モジュールが .dll に動的にリンクする必要がある場合は、「インポート ライブラリ」に対してリンクされます)。または他の解決策はありますか?

4

2 に答える 2

5

スタンドアロンの Lua インタープリターは、実行可能ファイル (Lua API) のシンボルを使用する共有ライブラリーの (dlopen による) 動的ロードをサポートしています。ビルド時に特別なリンク フラグは使用されません。共有ライブラリは、次の呪文を使用して構築されます。

env MACOSX_DEPLOYMENT_TARGET=10.3 gcc -bundle -undefined dynamic_lookup -o random.so lrandom.o
于 2010-10-18T13:08:05.017 に答える
4

ありがとう、あなたの答えはバンドルとdylibsの違いを調査したいという欲求を刺激しました。そして、ldのマニュアルページには、-bundle_loaderと呼ばれるオプションが記載されています。

-bundle_loader実行可能ファイル
これは、リンクされているバンドル出力ファイルをロードする実行可能ファイルを指定します。バンドルからの未定義のシンボルは、バンドルがリンクされているダイナミックライブラリの1つであるかのように、指定された実行可能ファイルに対してチェックされます。

(dylibのビルド時に-bundle_loaderが失敗することに注意してください。バンドルでのみ機能します)したがって、古いコマンドライン

cc -shared -o <output>.so <input>.c

になりました

cc -bundle -bundle_loader <executable> -o <output>.so <input>.c

出力バンドルは、実行可能ファイルに対して未定義のシンボルを解決しました。

于 2010-10-18T21:40:46.187 に答える