2013-04-30 11 views
5

私のC++ xcodeアプリケーション用のいくつかの静的ライブラリ(私自身のライブラリ)から参照されていないシンボルをすべてリンクしようとしています。私は 'ストリップ'に関連するすべてのプロパティを(ストリップのプロパティを検索して)試しましたが、参照されていないシンボル、特にクラスはリンクされません。xcodeのC++デッドコードストリッピングを無効にする方法

私は-rリンカフラグを試しましたが、その後、リンカは唯一と文句を言う: :

「をLD -rと-dead_stripを一緒に使用することはできません」私はリンカのフラグに「-no_dead_strip」を追加しようとしたが、その後、リンカーはちょうど私 「-no_dead_strip」を伝えます無視されます。

「Apple LLVM」と「​​LLVM GCC」の両方で同じ結果が得られます。

私の質問は、すべてのデッドコードストリッピングをオフにし、参照されていないクラスを強制的にリンクするために使用するリンカーのフラグまたはターゲットプロパティです。

+0

おそらく '--whole-archive'リンカフラグを試してみてください。 –

+0

AndroidのNDKには、 'native glue'(静的ライブラリ)に、実装のないapp_dummy()という空の関数が含まれています。クライアント側(言及されたライブラリとのリンク)からこれを呼び出すと、明らかにそのコンパイルユニット内のシンボルのストリッピングが防止されます。私はより洗練された方法を探していたが、誰も見えなかったようだ。 – pauluss86

答えて

6

標準のリンク機構 - .aファイルをリンクするための-lオプションを使用すると、使用されていないオブジェクトファイルがインテリジェントに除外されるため、結果のバイナリにシンボルが存在しない理由は、 。-force_load libraryarchive、同じように使用:-Wl,-force_load,libfoobar.alibfoobar.aはあなたがからすべてのシンボルを取得したいアーカイブであるあなたが1個のアーカイブからのすべてのシンボルを取得したい場合に

リンクされ、あなたはフラグを使用することができます。あなたはgcc/clangフラグ-Wl,-all_loadからそれを運転している場合-all_load、または:

は、すべてのアーカイブからのすべてのシンボルを取得するためには、リンカフラグを使用する必要があります。

これは、恐ろしいシンボルテーブルを生成します。

+1

「Dead Code Stripping」== Noと「Dead-Strip Inits and Terms」==はい、動作しませんでした。しかし、「-all_load」リンカーフラグを追加すると、すべてが完璧に機能しました。ありがとう!! –

関連する問題