Xcodeで動的ライブラリ(dylib)を作成するにはどうすればよいですか?
-
10-07-2019 - |
質問
Xcodeでコマンドラインユーティリティをいくつか作成しています(プレーンC、Cocoaはありません)。すべてのユーザーにlibpngのカスタマイズバージョンを使用してもらい、すべての実行可能ファイル間でライブラリのコピーを1つ共有することでスペースを節約したいです( .dylib
を再配布しても構いません) 。
libpngエクスポートシンボルを取得するには魔法をかける必要がありますか?
"ライブラリとバイナリをリンク" は静的にフェーズリンクを構築しますか?
Appleのドキュメントでは、実行時に dlopen
を使用してライブラリをロードすることが記載されていますが、シンボルの欠落について文句を言わずにXcodeで実行可能ファイルを作成するにはどうすればよいですか?
私はそれを理解したと思う:
-
libpngは、32/64ビットの実行可能ファイルと32ビットのライブラリを作成したため、適切にリンクしていませんでした。ライブラリと実行可能ファイルのビルド設定は一致する必要があります。
-
libpngのconfig.hには、
#define FEATURE_XXX_SUPPORTED
のような多数の定義が必要です。
-
"ライブラリとリンクバイナリ" ビルドフェーズは動的ライブラリを適切に処理し、
.dylib をロードするには
DYLD_FALLBACK_LIBRARY_PATH
環境変数が必要です code> s from application bundle。
解決
おそらく、ビルドするダイナミックライブラリに、ライブラリからエクスポートする必要があるものをリストしたエクスポートシンボルファイルがあることを確認する必要があります。これは、エクスポートするシンボルの単なるフラットなリストで、1行に1つです。
また、動的ライブラリがビルドされると、その中に埋め込まれたインストール名が取得されます。これは、デフォルトでは、ビルドされるパスです。その後、それに対してリンクするものはすべて指定されたパスで最初に検索し、その後のみ dyld(1)
man page 。
このライブラリを実行可能ファイルの隣に配置する場合、インストール名を調整してそれを参照する必要があります。 Googleで「インストール名」を検索するだけです。それを行う上で大量の情報を提供する必要があります。
他のヒント
Mac OS Xでの動的リンク、小さな例
手順:
- mymod.oを含むライブラリlibmylib.dylibを作成します
- " callmymod"のコンパイルとリンク
- DYLD_LIBRARY_PATHおよびDYLD_PRINT_LIBRARIESを使用して、callmymodからmymodを呼び出します
問題:あなたは「ただ」他のモジュールが使用するライブラリを作成したい。 しかし、gcc、ld、macosx libtool、dyldなどのプログラムの困難な山があります。 無数のオプション、よく腐った堆肥、MacOSXとLinuxの違いがあります。 多数のマニュアルページがあります(10.4.11 ppcで7679 + 1358 + 228 + 226行を数えます) ただし、例や「何をしているのか教えて」というプログラムではあまり意味がありません。モード。
(理解する上で最も重要なことは、 概要:自分で絵を描いたり、小さな例をいくつか実行したり、 他の人に説明してください。)
背景: apple OverviewOfDynamicLibraries 、 Wikipedia Dynamic_library
ステップ1、libmylib.dylibの作成-
mymod.c:
#include <stdio.h>
void mymod( int x )
{
printf( "mymod: %d\n", x );
}
gcc -c mymod.c # -> mymod.o
gcc -dynamiclib -current_version 1.0 mymod.o -o libmylib.dylib
# calls libtool with many options -- see man libtool
# -compatibility_version is used by dyld, see also cmpdylib
file libmylib.dylib # Mach-O dynamically linked shared library ppc
otool -L libmylib.dylib # versions, refs /usr/lib/libgcc_s.1.dylib
ステップ2、callmymodのコンパイルとリンク-
callmymod.c:
extern void mymod( int x );
int main( int argc, char** argv )
{
mymod( 42 );
}
gcc -c callmymod.c
gcc -v callmymod.o ./libmylib.dylib -o callmymod
# == gcc callmymod.o -dynamic -L. -lmylib
otool -L callmymod # refs libmylib.dylib
nm -gpv callmymod # U undef _mymod: just a reference, not mymod itself
ステップ3、libmylib.dylibにリンクするcallmymodを実行します-
export DYLD_PRINT_LIBRARIES=1 # see what dyld does, for ALL programs
./callmymod
dyld: loaded: libmylib.dylib ...
mymod: 42
mv libmylib.dylib /tmp
export DYLD_LIBRARY_PATH=/tmp # dir:dir:...
./callmymod
dyld: loaded: /tmp/libmylib.dylib ...
mymod: 42
unset DYLD_PRINT_LIBRARIES
unset DYLD_LIBRARY_PATH
これで小さな例が終わりました。手順の理解に役立てば幸いです。
(これを頻繁に行う場合は、 GNU Libtool をご覧ください。
これはMac上のglibtoolです。
および SCons 。)
乾杯
-denis
残念ながら、私の経験では、Appleのドキュメントは時代遅れで、冗長であり、通常必要な多くの一般的な情報が欠落しています。
このウェブサイトでこれをたくさん書いたのですが、ユニで開発したクロスプラットフォームゲームでFMOD(サウンドAPI)を使用する必要がありました。それは奇妙なプロセスであり、Appleが開発者ドキュメントに追加情報を追加していないことに驚いています。
残念ながら、「悪」としてマイクロソフトのように、彼らは実際に開発者をドキュメントで管理するのにはるかに良い仕事をしています(これはAppleの伝道者から来ています)。
基本的に、あなたがしていないことは、.appバンドルをコンパイルした後です。次に、実行可能ファイルがライブラリファイルを探す場所を変更するために、実行可能バイナリ/MyApp.app/contents/MacOS/MyAppでコマンドを実行する必要があります。スクリプトを実行できる新しいビルドフェーズを作成する必要があります。このプロセスについてはもう説明しません。ここで詳しく説明しました。
http:// brockwoolf .com / blog / how-to-use-dynamic-libraries-in-xcode-31-using-fmod
これがお役に立てば幸いです。
Appleのリファレンスページダイナミックライブラリプログラミングのトピック?必要なもののほとんどをカバーするはずです。プログラムの起動時に無条件にロードされる共有ライブラリと、オンデマンドでロードされる動的にロードされるライブラリ(バンドル、IIRC)があり、2つはMacOS XではLinuxまたはSolarisの同等のものと多少異なることに注意してください。