好的,我知道还有其他帖子关于你怎么不能从 OS X 二进制文件中实际删除Objective-C符号,因为它们对于Obj-C来说是必要的,但我的情况有点不同。
我有一个二进制文件,它是一个包。它既可以用作VST插件,也可以用作AudioUnit插件。这个想法是二进制包含两种格式的所有入口点,你只需编译一次,然后为VST版本命名一个带有“ .vst ”的副本,并且“。 AU版本的组件“。 (这是使用JUCE框架BTW。)
问题是对于AU方面,您必须导出Obj-C类以创建Cocoa UI
视图。在VST方面,永远不会使用此类。但是如果你有像Ableton Live这样的主机允许你同时加载同一个插件的AU和VST版本,那么现在我们遇到了典型的Obj-C命名空间冲突问题。
在VST方面,该特定的Obj-C类永远不会被使用。所以我想做的是使用“strip”从生成的二进制文件中删除那些Obj-C类。这仍然保留了为两种格式只编译一次的优点。
无论如何,我已经尝试使用"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
有什么想法吗?
顺便说一下,我后来能够动态注册有问题的类(使用唯一的名称),这也解决了这个问题。但是,如果我可以开始工作,我可以为现有的二进制文件部署解决方案。答案 0 :(得分:3)
您不能简单地从二进制文件中删除一个类。然而,你可以做的是欺骗Objective-C运行时相信你的插件不包含任何Objective-C代码。只需将__objc_imageinfo
更改为__objc_imageinfX
,例如在您的VST插件二进制文件中。您可以使用perl轻松完成:
perl -pi -e 's/__objc_imageinfo/__objc_imageinfX/g' <path to binary>
修补VST插件后,将绕过所有Objective-C初始化,您将看不到此错误消息:Class JuceDemoProjectAU is implemented in both …/VSTPlugin and …/AUPlugin. One of the two will be used. Which one is undefined.
要小心,你真的不应该使用这个技巧!解决问题的方法是编译插件的两个不同版本,或者像其他人建议的那样动态注册类。
答案 1 :(得分:2)
去年在coreaudio列表上有一个关于类似内容的帖子:Collision between Cocoa classes for AU and VST plugins。
提供的解决方案是register the classes dynamically,这就是你说你已经有的工作。如果有办法去除你想要的符号,我相信这些人会知道它。