1

基本的に、私はここの指示に従いました: 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を除いて、すべてがコンパイルされて実行されます。

すべてをゼロから構築する場合、どうすれば 2 つの ABI を持つことができますか? GUI を別の方法で構成する必要がありますか? 私はこれについて数週間頭を悩ませてきました。

4

2 に答える 2