2013-09-28 326 views
0

我對Objective C完全陌生,我試圖用它來包裝C-library。我有一個main.mwrap.mwrap.h文件。從我在頭文件中收集的內容中,我包括@interface和源文件,我將包括@implementation但是,我並不真正瞭解要在每個文件中包含哪些內容。現在我的主要文件是:在目標C中實現標頭C

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文件,但我不知道該怎麼做。任何幫助都將不勝感激!

+0

您正在編寫C方法,而不是Objective-C方法。沒有定義Objective-C對象,因此您將.h編碼爲C.否@interface,無屬性。 –

+0

我正在爲上面顯示的當前代碼製作Objective-C包裝,所以我需要Objective-C代碼 –

回答

0

如果你使用CommandLineTool模板在Xcode中啓動你的項目,你可以選擇你的語言爲「C」或「C++」,所以你根本不用瞎搞Objective-C。

You can do a project in C

main.c is the file here

至於您當前擁有.h文件,不做 「@property」 或 「@interface」 爲 「main」。 「main」是C風格的函數,而不是Objective-C的東西。

0

如果您確實對objectivec解決方案感興趣,請按照Michael Dautermann的說明啓動新的Command Line項目,而不是Type C使用Foundation選項。這會給你一個工作的主要(只是一個常規的C函數)。然後選擇new-> objective c class來創建你的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 
+0

是的,這基本上就是我所做的,我的'main.m'是C庫的一部分,我只是不' t知道什麼東西放在我的包裝文件 –

+0

包裝可可中的任何C庫基本上是微不足道的,但你的情況令人費解。 「你的主」真的是「C庫」的一部分嗎? wrap.h中的「@interface main:NSObject」是什麼? –

+0

我認爲我需要它,它是libarchive庫的一部分 –