foo.c bar.cとbaz.cに加えて、他のファイルのコードとデータを使用する関数myfn()を定義するラッパーコードmyfn.cがあります。静的アーカイブにおけるCのシンボルの可視性
オブジェクトファイルやアーカイブmyfn.oやlibmyfn.aのようなものを作成したいので、myfn()を他のプロジェクトで利用できるようにするには{foo、bar、 baz} .oも同様です。
Linux/gccでこれを行う正しい方法は何ですか?ありがとう。
更新:私はそれを行う方法を見つけました。もともと、これはDSOではなく静的アーカイブに関するものであることを強調しておきました。とにかく、レシピ:
#define PUBLIC __attribute__ ((visibility("default")))
は、myfn.c
でPUBLIC
としてmyfn()
をマーク。何も記さないでくださいPUBLIC
。gcc -c foo.c bar.c baz.c myfn.c -fvisibility=hidden
でオブジェクトをコンパイルします。このオブジェクトは、myfn()
以外のすべてを隠しとしてマークします。ld
の部分連動するスイッチ使用して便利なアーカイブを作成しますので、同じようPUBLIC
ませんでしたすべてのものをローカライズld -r foo.o bar.o baz.o myfn.o -o libmyfn.a
を:今
objcopy --localize-hidden libmyfn.a
nm
はmyfn
がで唯一のグローバル・シンボルであると言いますlibmyfn.a
以降の他のプログラムへのリンクは、gcc -o main main.c -L. -lmyfn
(ここではプログラムはmyfn()
を呼び出し、foo()
を呼び出そうとするとコンパイルは失敗します)。
私はステップ3でar
代わりのld -r
を使用する場合は、コンパイルは、ステップ5で失敗した:私はar
がmyfn
にfoo
などをリンクされておらず、もはやかつてそれらの機能がローカライズされていないことができますね、ld -r
が解決に対し、ローカライズされる前にリンクしてください。
「正しい」方法であることを確認するか、より巧妙な方法で実現することを歓迎します。
正しい方法は、図書館の作成に関する文献やチュートリアルを見つけることです。 –
私は答えとしてユージンを投稿することに賛成しますので、私はそれをダウン投票することができます。ありがとう。 – PythonAteMyHamster