OK、Obj-Cがまったく機能するために必要なため、 OS XバイナリからObjective-Cシンボルを実際に削除できない方法について他の投稿があることは知っていますが、私の場合は少し異なります。
バンドルである単一のバイナリがあります。VSTプラグインまたはAudioUnitプラグインとして使用することを目的としています。バイナリには両方のフォーマットのすべてのエントリポイントが含まれており、一度コンパイルしてから、VSTバージョンの場合は「.vst」、AUバージョンの場合は 「 .component 」で1つのコピーに名前を付けるという考え方です。(これはJUCEフレームワークを使用しています。)
UI
問題は、AU側の場合、Cocoaビューを作成するためにObj-Cクラスをエクスポートする必要があることです。VST側では、このクラスは使用されません。しかし、同じプラグインのAUバージョンとVSTバージョンの両方を同時にロードできるAbleton Liveのようなホストがある場合、典型的なObj-C名前空間の衝突の問題が発生します。
VST側では、その特定のObj-Cクラスが使用されることはありません。したがって、私がやりたいのは、「strip」を使用して、結果のバイナリからこれらのObj-Cクラスを削除することです。これでも、両方の形式ですべてを1回コンパイルするだけの利点が維持されます。
とにかく、"strip -R stripfile.txt <path to binary>"
stripfile.txtに削除したいシンボルが含まれている、を使用してみましたが、バイナリにシンボルが見つからないと常に失敗します。ストリップファイルの名前を操作しようとしましたが、それは役に立ちません(または間違っています)。
「nm-m」によって出力される、削除したい関連するシンボルは次のとおりです。
000000000003bb00 (__TEXT,__text) non-external -[JuceDemoProjectAU description]
000000000003bb60 (__TEXT,__text) non-external -[JuceDemoProjectAU interfaceVersion]
000000000003ba00 (__TEXT,__text) non-external -[JuceDemoProjectAU uiViewForAudioUnit:withSize:]
0000000000b02398 (__DATA,__objc_data) external _OBJC_CLASS_$_JuceDemoProjectAU
0000000000b023c0 (__DATA,__objc_data) external _OBJC_METACLASS_$_JuceDemoProjectAU
何か案は?
ところで、私はその後、問題のクラスを(一意の名前を使用して)動的に登録することができました。これも問題を解決します。ただし、ストリップを機能させることができれば、フィールドにすでに存在するバイナリのソリューションを展開できる可能性があります。