我正在尝试快速测试在使用我的Xcode项目之前使用SecureUDID获得的结果。在这种情况下,我使用CodeRunner但我从未在Xcode之外编译obj-c代码。我已经附加了我在使用CodeRunner为Obj-c文件提供的默认编译标志时得到的错误。我已经尝试了从这个questions的答案中获得灵感的编译标志选项,但仍然得到了基本相同的错误。我应该使用哪些编译标志?有没有什么好的资源可以学习如何在Xcode之外编译obj-c?请帮助谢谢!
更新:看起来我现在需要在编译标志中添加UIKit和其他人吗?
答案 0 :(得分:9)
我同意Mattia,Xcode可能是最好的方式,但是:接受挑战。
首先,让我们让CodeRunner与UIKit一起编译。在CodeRunner首选项中,复制Objective-C语言并将其命名为“iOS”。我正在使用Xcode使用的命令(可以在Log Navigator中找到)作为模板。这也是Mattia所说的。将Compilation Flags设置为如下所示:
-arch i386 -fmessage-length = 0 -std = c99 -fpascal-strings -O0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk -fexceptions -fasm-blocks -g -fvisibility = hidden -fobjc-abi-version = 2 -fobjc-legacy-dispatch -mios-simulator-version-min = 5.1 -framework Foundation -framework UIKit -F /Applications/Xcode.app /Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/System/Library/Frameworks
请注意iPhoneSimulator5.1.sdk
路径和-mios-simulator-version-min=5.1
标记。您可能需要为自己的系统和版本更改这些内容。
首先,尝试使用以下iOS代码(您也可以在首选项中将其设为模板):
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface AppDelegate : NSObject <UIApplicationDelegate>
@property (nonatomic, retain) UIWindow * window;
@property (nonatomic, retain) UIViewController * viewController;
@end
@implementation AppDelegate
@synthesize window = _window;
@synthesize viewController = _viewController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.viewController = [[[UIViewController alloc] initWithNibName:nil bundle:nil] autorelease];
self.viewController.view.backgroundColor = [UIColor orangeColor];
UILabel * label = [[UILabel alloc] initWithFrame:self.viewController.view.bounds];
label.font = [UIFont boldSystemFontOfSize:48.0];
label.textColor = [UIColor whiteColor];
label.backgroundColor = [UIColor clearColor];
label.textAlignment = UITextAlignmentCenter;
label.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
label.text = @"Hello World";
[self.viewController.view addSubview:label];
[label release];
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
@end
int main(int argc, char *argv[]) {
@autoreleasepool {
UIApplicationMain(argc, argv, nil, @"AppDelegate");
}
}
如果你试图运行,它应该编译,但应用程序将崩溃并出现此错误:
dyld:未加载库:/System/Library/Frameworks/UIKit.framework/UIKit
这是因为你试图在没有UIKit的Mac上运行iOS应用程序;它需要在模拟器中运行。返回首选项,将Run Command更改为:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone \ Simulator.app/Contents/MacOS/iPhone \ Simulator -SimulateApplication $ PWD / $ compiler
现在运行相同的代码。 iOS模拟器应该启动,你应该看到一个带有“Hello World”的橙色屏幕:
现在让它与SecureUDID一起使用。你需要在某处保存代码。现在将SecureUDID .h和.m文件复制到与保存的代码相同的文件夹中。将#import "SecureUDID.h"
添加到文件顶部,将字体大小更改为14.0
,然后将@"Hello World"
更改为[SecureUDID UDIDForDomain:@"com.example.test" usingKey:@"abcdefg"]
。如果你运行代码,它会抱怨它无法找到你看到的SecureUDID符号。我们需要在编译标志中添加“SecureUDID.m”。因此,您可以在CodeRunner中重用iOS语言,您可以将其添加到自定义运行中的标志中,但是每次要运行时都需要处理该模态视图。
然后你去了:
不幸的是,日志记录不会出现在CodeRunner控制台中,但您可以打开Mac应用程序控制台来查看它们。我也得到一些额外的黑色填充物。还不确定我做错了什么。
答案 1 :(得分:2)
该错误意味着链接器无法找到SecureUDID(.m文件或库)的实现。如果你去coderunner的首选项,你可以设置命令行选项并将其指向实现,但老实说,在Xcode中创建一个新项目来测试它可能会更快。 Coderunner很棒但是当你必须处理外部库/源文件时,更容易制作一个一次性的Xcode项目。
更新:
UIKit是一个iOS框架,因此它不适用于像Foundation这样的常规框架。假设你安装了Xcode 4.3,你可以在以下网址找到UIKit:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks
您需要将该目录添加到框架搜索路径,然后添加:
-framework UIKit
在Coderunner中编译参数。
你的问题的真正答案是停止尝试使用Coderunner并使用Xcode。 Coderunner用于编写小代码片段,而无需进行所有配置来创建Xcode项目。在这种情况下你需要的是所有的配置和Xcode允许你这样做,所以不要与coderunner打架使它像一个完整的IDE,你应该只使用Xcode - 你会更高兴它。