基本上,我按照这里的说明进行操作:http ://wiki.gnustep.org/index.php/GNUstep_under_Ubuntu_Linux
随着构建 gui 和返回的额外步骤。
如果我构建并运行一个非 gui 程序,一切正常。仅当我添加使用 gui 的内容时,如下所示:
// Created by Tobias Lensing on 2/22/13.
#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>
#import <dispatch/dispatch.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
return num * multiplier;
};
NSLog(@"%d", myBlock(3));
dispatch_queue_t queue = dispatch_queue_create(NULL, NULL);
dispatch_sync(queue, ^{
printf("Hello, world from a dispatch queue!\n");
});
// dispatch_release(queue); // ARC takes care of this
}
@autoreleasepool {
[NSApplication sharedApplication];
NSRunAlertPanel(@"Test", @"Wow it works!", @"OK", nil, nil);
}
return 0;
}
我用以下内容编译它:
clang `gnustep-config --objc-flags` `gnustep-config --objc-libs` -fobjc-arc -fobjc-runtime=gnustep -fblocks -lobjc -ldispatch -lgnustep-gui test.m
它编译和链接没有错误。
但是,当我运行它时,它会吐出以下丑陋的语法:
Hello, world from a dispatch queue!
Objective-C ABI Error: Loading modules from incompatible ABI's while loading .GSBackend.m
a.out: /home/lloyd/projects/ThirdParty/BuildGnuStep/libobjc2/loader.c:53: void __objc_exec_class(struct objc_module_abi_8 *): Assertion `objc_check_abi_verion(module)' failed.
Aborted (core dumped)
我向自己保证没有其他版本的 libobjc(这是在虚拟机上,所以我可以回去重做我的步骤)。
注释掉以下内容:
// [NSApplication sharedApplication];
// NSRunAlertPanel(@"Test", @"Wow it works!", @"OK", nil, nil);
一切都编译并运行,显然除了 GUI。
当我从头开始构建所有东西时,我如何拥有两个 ABI?我是否需要以不同方式配置 GUI?我已经为此困惑了几个星期。