我的应用使用following code:
#if MAC_OS_X_VERSION_10_5 < MAC_OS_X_VERSION_MAX_ALLOWED
NSArray *globalPreferencePanes =
NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory,
NSAllDomainsMask, YES);
#else
NSArray *globalPreferencePanes =
[NSArray arrayWithObjects:@"/Library/PreferencePanes",
[@"~/Library/PreferencePanes" stringByExpandingTildeInPath], nil];
#endif
return globalPreferencePanes;
我正在编译它的项目针对的是10.5 Mac OSX SDK,其中NSPreferencePanesDirectory
不存在(它只存在于10.6+中)。因此,我有#if
和#else
以检查我们正在运行的Mac OSX的版本,因此我知道是应该使用NSPreferencePanesDirectory
还是只是手动给出首选项窗格目录的位置。
为了停止使用“未声明的标识符”错误,我应该更改什么?
感谢。
答案 0 :(得分:3)
#if
在编译时评估,而不是运行时。您可能想要做的是使用当前的SDK(10.7),并执行以下操作:
NSArray *globalPreferencePanes;
if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_6)
globalPreferencePanes = NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSAllDomainsMask, YES);
else
globalPreferencePanes = [NSArray arrayWithObjects:@"/Library/PreferencePanes", [@"~/Library/PreferencePanes" stringByExpandingTildeInPath], nil];
return globalPreferencePanes;
确保将目标操作系统版本设置为10.5,以便符号弱链接。否则,您可以下拉并使用CoreServices'FSFindFolder()
:
NSMutableArray *globalPreferencePanes = [NSMutableArray array];
FSRef foundRef;
OSErr err = FSFindFolder(kLocalDomain, kPreferencePanesFolderType, false, &foundRef);
if (err != noErr) {
CFURLRef url = CFURLCreateFromFSRef(NULL, &fsRef);
CFStringRef path = CFURLCopyPath(url);
[globalPreferencePanes addObject:(id)path];
CFRelease(path);
CFRelease(url);
}
OSErr err = FSFindFolder(kUserDomain, kPreferencePanesFolderType, false, &foundRef);
if (err != noErr) {
CFURLRef url = CFURLCreateFromFSRef(NULL, &fsRef);
CFStringRef path = CFURLCopyPath(url);
[globalPreferencePanes addObject:(id)path];
CFRelease(path);
CFRelease(url);
}
return globalPreferencePanes;
(未经测试)
答案 1 :(得分:0)
如果您使用的是10.5.x,那么您仍然会收到错误,因为&#34; NSPreferencePanesDirectory&#34;不是一个已知的符号。我为朋友解决了这个问题,并将osxsupport.m中的FindPrefsDir函数代码更改为:
char *FindPrefsDir(void)
{
char *resstr = NULL;
NSArray *globalPreferencePanes;
globalPreferencePanes = [NSArray arrayWithObjects:@"/Library/PreferencePanes", [@"~/Library/PreferencePanes" stringByExpandingTildeInPath], nil];
if ([globalPreferencePanes count] > 0)
{
resstr = StringToChar([globalPreferencePanes objectAtIndex:0]) ;
}
return resstr;
}
感谢Wevah的代码建议,但它并没有直接为我工作。所以我稍微改了一下,我的朋友仍然在10.5.x之后可以完美地构建它。