0

我是全新的Objective C,我正在尝试用它来包装一个C-library. 我有一个main.m wrap.mwrap.h文件。根据我在包含的头文件@interface和源文件中收集的内容,我将包含@implementation但是我并没有真正理解要包含在每个文件中的内容。现在我的主要文件是:

int copy_data(struct archive *ar, struct archive *aw) {

    for (;;) {
        const void *buff;
        size_t size;
        off_t offset;

        int r = archive_read_data_block(ar, &buff, &size, &offset);
        if (r == ARCHIVE_EOF)
            return (ARCHIVE_OK);

        archive_write_data_block(aw, buff, size, offset);
    }
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        struct archive *a;
        struct archive *ext;
        struct archive_entry *entry;
        int flags;
        int r;

        /* Select which attributes we want to restore. */
        flags = ARCHIVE_EXTRACT_TIME;
        flags |= ARCHIVE_EXTRACT_PERM;
        flags |= ARCHIVE_EXTRACT_ACL;
        flags |= ARCHIVE_EXTRACT_FFLAGS;

        a = archive_read_new();
        archive_read_support_format_all(a);
        archive_read_support_compression_all(a);
        ext = archive_write_disk_new();
        archive_write_disk_set_options(ext, flags);
        archive_write_disk_set_standard_lookup(ext);
        r = archive_read_open_filename(a, argv[1], 10240);

        for (;;) {
            r = archive_read_next_header(a, &entry);
            if (r == ARCHIVE_EOF)
                break;

            r = archive_write_header(ext, entry);
            if (archive_entry_size(entry) > 0) {
                copy_data(a, ext);
            }

            archive_write_finish_entry(ext);
        }
        archive_read_close(a);
        archive_read_free(a);
        archive_write_close(ext);
        archive_write_free(ext);
        NSLog(@"No Issues");

    }
    return 0;
}

到目前为止,我在wrap.h文件中得到的是:

typedef struct{
int *a;
int *ext;

}archive;

@interface main : NSObject

@property int flags;
@property int r;

我不知道这是否接近我需要做的事情,并且我ARCHIVE_EXTRACT说它们是未声明的标识符时遇到了错误,我认为它们也必须进入我的wrap.h文件,但我不确定该怎么做。任何帮助将不胜感激!

4

2 回答 2

0

如果您真的对客观解决方案感兴趣,请按照 Michael Dautermann 的说明开始一个新的命令行项目,但不要使用 Type C,而是使用 Foundation 选项。这将为您提供一个工作 main(只是一个常规的 c 函数)。然后选择 new->objective c 类来创建你的 wrap.h/wrap.m。在 wrap.h 中,您几乎只需要声明自己的 Objectivec 公共包装方法。在 wrap.m 中,您将导入要包装的内容,并定义包装函数。

//
//  main.m
//

#import <Foundation/Foundation.h>
#import "wrap.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {

        [wrap wrappedStuff];

    }
    return 0;
}

//
//  wrap.h
//


----------


#import <Foundation/Foundation.h>


@interface wrap : NSObject
+ (void)wrappedStuff;
@end



//
//  wrap.m
//

#import "wrap.h"
#include "WhatImWrapping.h"

@implementation wrap

int copy_data(struct archive *ar, struct archive *aw) {

    for (;;) {
        const void *buff;
        size_t size;
        off_t offset;

        int r = archive_read_data_block(ar, &buff, &size, &offset);
        if (r == ARCHIVE_EOF)
            return (ARCHIVE_OK);

        archive_write_data_block(aw, buff, size, offset);
    }
}

+ (void)wrappedStuff
{
    struct archive *a;
    struct archive *ext;
    struct archive_entry *entry;
    int flags;
    int r;

    /* Select which attributes we want to restore. */
    flags = ARCHIVE_EXTRACT_TIME;
    flags |= ARCHIVE_EXTRACT_PERM;
    flags |= ARCHIVE_EXTRACT_ACL;
    flags |= ARCHIVE_EXTRACT_FFLAGS;

    a = archive_read_new();
    archive_read_support_format_all(a);
    archive_read_support_compression_all(a);
    ext = archive_write_disk_new();
    archive_write_disk_set_options(ext, flags);
    archive_write_disk_set_standard_lookup(ext);
    r = archive_read_open_filename(a, argv[1], 10240);

    for (;;) {
        r = archive_read_next_header(a, &entry);
        if (r == ARCHIVE_EOF)
            break;

        r = archive_write_header(ext, entry);
        if (archive_entry_size(entry) > 0) {
            copy_data(a, ext);
        }

        archive_write_finish_entry(ext);
    }
    archive_read_close(a);
    archive_read_free(a);
    archive_write_close(ext);
    archive_write_free(ext);
    NSLog(@"No Issues");
}
@end
于 2013-09-28T19:00:32.683 回答
0

如果您使用 CommandLineTool 模板在 Xcode 中启动您的项目,您可以选择您的语言为“C”或“C++”,这样您就不必完全使用 Objective-C。

你可以用C做一个项目

main.c 是这里的文件

至于你目前拥有的.h文件,不要为“”做“ ”@property或“ ”。" " 是 C 风格的函数,而不是 Objective-C 的东西。@interfacemainmain

于 2013-09-28T18:37:13.647 回答