19

Darwin に移植する Linux 用の Makefile があります。makefile は一連の .o ファイルを取り、それらを .so 共有オブジェクトにリンクします。わかりましたので、ダーウィンでこれに最適なアナログは dylib であると考えました (これは間違っていますか?)。そこで、-shared フラグを -dynamiclib に変更しました。

現在、dylib にリンクしているコードは、多くの外部ライブラリに依存しています。dylib をビルドしようとすると、未定義の参照があるというエラーが表示されます。しかし、Linux Makefile は、.so ファイルを作成するビルド ステップで -lwhatever または -L/path/whatever オプションを指定していません。ん?これは、ELF .so ファイルを作成すると、デフォルトで外部参照が未解決のままになり、共有ライブラリがロードされると再帰的にロードしている共有ライブラリに依存する共有ライブラリをロードしますか? 共有ライブラリが .a または .o ファイルに依存している場合、それらを共有ライブラリに静的にリンクする必要があります。そうしないと、実行時にリンクできません。実行時にロードされるライブラリに未定義の参照があることをどのように回避できますか?参照が動的にロード可能なライブラリへの参照でもある場合を除きます。

とにかくそう指定すれば

-undefined suppress -flat_namespace

共有ライブラリを作成するときに -l オプションと -L オプションを追加する必要はありません。しかし、これが最終的にどのように機能するかはまだわかりません。

4

2 に答える 2

16

このスレッドでも、この問題について説明しています。重要な点は、Linux のようなリンク動作を得るには、「-undefined dynamic_lookup」フラグを指定する必要があるということだと思います。デフォルトでは、ダイナミック ライブラリに未定義の参照がある場合、Darwin リンカはエラーをスローします。-U を使用して、シンボルごとにこの動作を設定することもできます。参照については、「man ld」を参照してください。

于 2011-03-05T02:16:57.133 に答える
1

を使用しlibtoolます。

libtool -dynamic -multiply_defined suppress -install_name `basename ../../../../rlp/lib/universal-darwin9-gcc40/libbtutils.dylib` -o ../../../../rlp/lib/universal-darwin9-gcc40/libbtutils.dylib   ../../../../rlp/lib/universal-darwin9-gcc40/libbtd.a ../../../../rlp/lib/universal-darwin9-gcc40/libbttrie.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtkey.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtunit.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtutilities.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtopts.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtxcode.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtprops.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtxml.a ../../../../rlp/lib/universal-darwin9-gcc40/libbttake3.a ../../../../rlp/lib/universal-darwin9-gcc40/libbttake5.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtac.a  -lstdc++.6 -lgcc_s.10.4 ../../../../build_system/lib/universal-darwin9-gcc40/libgcc.a -lSystem -lSystemStubs`
于 2010-09-12T15:40:47.650 に答える