0

このコードは Linux ではコンパイルされますが、Mac osx ではコンパイルされません (lib.c の内容は次のとおりです)。

int add(int a, int b);

int sum(int a, int b) {return add(a, b);}

Linuxでは、このコマンドを使用すると機能します:

gcc -shared -fPIC lib.c -o lib.so

同じコマンドが mac osx で失敗し、次のエラーが発生します。

アーキテクチャ x86_64 の未定義シンボル:
"_add"、参照元:
ccK5mZfC.old の_sum:
アーキテクチャ x86_64 のシンボルが見つかりません
collect2: ld は 1 終了ステータスを返しました

これを解決するために、gcc オプションまたは Xcode IDE をチェックインするオプションを提案していただけませんか?

よろしくお願いします

4

1 に答える 1

0

ツールチェーンで未解決の静的外部を使用して共有ライブラリを構築できるとは思いません。

次のいずれかを行う必要があります。

  • add statically を含むモジュールのリンク
  • add dynamic を含むモジュール内のリンク
  • ビルドしている共有ライブラリに add 関数を含めます

そうしないと、ローダーが共有ライブラリからリンク先のコードへの参照を「修正」できないため、共有ライブラリには未解決の未解決の外部が含まれます。

「位置に依存しないコード」に関する質問を更新:

これは位置の独立性の問題ではなく、ロード中に名前付きシンボルを見つけることができるローダーの問題です。これは Linux では許可されるかもしれませんが、OSX (FreeBSD および MACH ベース) では、ローダーは共有ライブラリのシンボルが内部的に解決されるか、スタブが既知の別の共有ライブラリを介して解決されることを期待します。

すべてのオブジェクトへの明示的な参照がなくても静的 (.o) ライブラリを構築できますが、共有 (.so) ライブラリを構築するには、参照されるすべてのシンボルがライブラリ内に含まれているか、外部参照があることを確認する必要があります。ローダーがロード時に解決できること。

于 2013-07-05T15:22:22.633 に答える