【问题标题】:Symbol not found: _OBJC_CLASS_$_Article未找到符号:_OBJC_CLASS_$_Article
【发布时间】:2023-03-16 17:45:01
【问题描述】:

我正在对 Vienna 进行扩展,以添加第三方编写 Objective-C 插件的能力,但我仅在 64 位模式下运行时遇到了一些运行时链接器问题(一切似乎在32 位模式)。我的插件 SynkPlugin 由 Vienna.app 中的以下代码加载:

NSArray * bundlePaths = [NSBundle pathsForResourcesOfType:@"bundle" inDirectory:[[Preferences standardPreferences] pluginsFolder]];
NSEnumerator * enumerator = [bundlePaths objectEnumerator];
NSString * bundlePath;
NSMutableArray * plugins = [NSMutableArray array];
while ( (bundlePath = [enumerator nextObject]) != nil )
{
    NSBundle * pluginBundle = [NSBundle bundleWithPath:bundlePath];
    Class principalClass = [pluginBundle principalClass];
    id <ViennaPlugin, NSObject> plugin = [[principalClass alloc] init];
    [plugins addObject:plugin];
    [plugin release];
    NSLog(@"Loaded plugin %@ [main class: %@]", bundlePath, principalClass);
}

在控制台输出中,我收到以下错误消息:

2010-07-09 08:55:40.128 Vienna[74065:a0f] Error loading /Users/dcrosta/Library/Application Support/Vienna/PlugIns/SynkPlugin.bundle/Contents/MacOS/SynkPlugin: dlopen(/Users/dcrosta/Library/Application Support/Vienna/PlugIns/SynkPlugin.bundle/Contents/MacOS/SynkPlugin, 265): Symbol not found: _OBJC_CLASS_$_Article
  Referenced from: /Users/dcrosta/Library/Application Support/Vienna/PlugIns/SynkPlugin.bundle/Contents/MacOS/SynkPlugin
  Expected in: flat namespace
  in /Users/dcrosta/Library/Application Support/Vienna/PlugIns/SynkPlugin.bundle/Contents/MacOS/SynkPlugin

只有在 64 位模式下运行时才会出现此错误,而不是 32 位模式下。 Vienna 和 SynkPlugin 都使用“标准 32/64 通用”设置进行编译,并且 SynkPlugin 具有附加的链接器标志“-undefined dynamic_lookup”,据我了解,它允许它链接到在 Vienna.app 中找到的类而无需将这些类的代码编译成自己的二进制文件。

Stack Overflow 上对这个错误的其他引用与 iPhone/iPod Touch 和 iPad 之间的 UIKit 差异有关——在这些情况下,框架实际上缺少 iPhone/iPod Touch 上的类。就我而言,我确信 Vienna.app 在其中的某个地方有 Article 类,因为它是由与 32 位版本相同的代码构建的。

以前有人见过这样的错误吗?对在哪里寻找更多信息有什么建议吗?谢谢。

【问题讨论】:

    标签: objective-c cocoa x86-64 dynamic-linking


    【解决方案1】:

    在 Vienna 目标的构建设置中,在 GCC 4.2 - 代码生成 下取消选中 Symbols Hidden by Default (GCC_SYMBOLS_PRIVATE_EXTERN)。

    【讨论】:

    • 太好了,谢谢!知道为什么这在 32 位构建中有效(或在通用构建中作为 32 位应用程序运行时)但在 64 位中无效?
    • 是的,符号可见性和 Objective-C:developer.apple.com/mac/library/documentation/DeveloperTools/…
    • 参考注意事项:目标也不得选择“Strip Linked Product”选项(在构建设置中的部署下)
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2020-01-24
    • 2014-07-30
    • 2015-10-27
    相关资源
    最近更新 更多