2013-12-26 2 views
2

Я хочу создать статическую библиотеку в Objective C iOS. Но в этом я хочу определить только структуру в файле .h. Там не будет никакого файла .m файла.Как включить файл .h, содержащий структуру только в статической библиотеке

struct ApiResponseStruct 
{ 
    __unsafe_unretained NSString * const A; 
    __unsafe_unretained NSString * const B; 
    __unsafe_unretained NSString * const C; 
    __unsafe_unretained NSString * const D; 
}; 

extern const struct ApiResponseStruct ApiResponse; 

Итак, когда я создаю свою статическую библиотеку и включаю ее в демонстрационное приложение. Это всегда показывает мне ошибку компоновщика.

Undefined symbols for architecture armv7: 
    "_ApiResponse", referenced from: 
     -[TestLib setApiResponse] in libTestLib.a(TestLib.o) 
     -[TestLib getApiResponse] in libTestLib.a(TestLib.o) 
ld: symbol(s) not found for architecture armv7 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Итак, может кто-то помочь мне в решении этого вопроса.

Спасибо заранее.

+0

создать объектный файл протокола C. у него просто будет .h. Теперь ваши другие классы должны применять этот протокол. Скажите мне, если не ясно или если требуется больше информации. Как создать файл протокола: 1. Новый файл 2. Cocoa Touch -> Objective C Протокол –

+0

Я не создает каких-либо протоколов. Мне нужно сделать, создать.h файл с простой структурой, о которой я упоминал в вопросе. Я хочу, чтобы этот файл был включен в мою статическую библиотеку, и мне нужно использовать этот файл в своем демонстрационном приложении. – user3124624

+0

Да, я знаю это. что я говорю, создайте файл протокола Obj-C, перечислите свойства, которые вам нужны в вашей структуре в файле. Не кладите туда структуру. Теперь используйте этот файл протокола в своем приложении. Если какой-либо класс нуждается в определенной структуре, пусть они соблюдают протокол. могу ли я передать свою мысль? –

ответ

2

Когда вы пишете это опережающее объявление,

extern const struct ApiResponseStruct ApiResponse; 

вы обещаете компилятор, что есть нестатический определение из ApiResponse в одном из ваших файлов. Похоже, что ни один из ваших файлов .m не дает этого определения, поэтому компоновщик жалуется, что ApiResponse не определен.

Добавить

const struct ApiResponseStruct ApiResponse; 

к одной из ваших .m или .c файлов. Это может быть в вашей библиотеке или в вашем приложении, но она должна существовать для правильного компиляции вашего проекта.

Как присвоить значение ApiResponse.A = @ "String"? Я получаю сообщение об ошибке при попытке.

У вас возникла ошибка, потому что вы пытаетесь назначить его в статическом контексте. Вам нужно сделать задание во время выполнения, например, из application:didFinishLaunchingWithOptions: метода вашего приложения делегат:

// Define your struct outside the method 
struct ApiResponseStruct ApiResponse; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    ... // Your regular "didFinishLaunchingWithOptions' code... 
    ApiResponse.A = @"Quick"; 
    ApiResponse.B = @"Brown"; 
    ApiResponse.C = @"Fox"; 
    ApiResponse.D = @"Jumos"; 
    return YES; 
} 

Вы не смогли бы сохранить эту const, потому что это не представляется возможным обеспечить содержательную статическую инициализацию NSString* полей. Вы должны либо изменить заголовок этого

extern struct ApiResponseStruct ApiResponse; 

или использовать другой подход: сделать указатель на ApiResponseconst, и указать его статический неконстантные struct, как это:

extern const struct ApiResponseStruct *ptrApiResponse; 

в файле приложения делегат:

struct ApiResponseStruct ApiResponse; 
const struct ApiResponseStruct *ptrApiResponse = &ApiResponse; 

Пользователи вашего API бы написать ptrApiResponse->A вместо ApiResponse.A, но компилятор сможет обеспечить постоянство.

+0

Спасибо. Я могу успешно скомпилировать код. – user3124624

+0

Можете ли вы помочь мне в назначении значения ApiResponse.A = @ "String" ?? Который даже дает мне ошибку – user3124624

+0

Я получаю ошибку. Переопределение «ApiResponse» с другим типом: «struct ApiResponseStruct» vs 'const struct ApiResponseStruct'. – user3124624

Смежные вопросы