Файл символов экспорта: члены класса Objective C, 64-битные - PullRequest
4 голосов
/ 17 декабря 2011

У меня есть универсальная динамическая библиотека на основе Какао, которая также включает больше статических библиотек, из которых я хочу экспортировать функциональность.Кажется, я не могу сделать последнее без использования файла символов экспорта, и это нормально для меня ... как-то.Я нигде не использую параметр «Символы, скрытые по умолчанию» (GCC_SYMBOLS_PRIVATE_EXTERN, -fvisibility = hidden).Проблема возникла, когда я пытался экспортировать базовый класс из динамической библиотеки, более конкретно при попытке использовать его члены в производных классах, не включенных в библиотеку, и даже более конкретно в 64-разрядной сборке: «Неопределенные символы:» _OBJC_IVAR_$ _PluginBase.fConn "" Мне известны 64-разрядные изменения: http://developer.apple.com/library/mac/#releasenotes/Cocoa/RN-ObjectiveC/_index.html, раздел "Управление доступом к 64-разрядным классам и экземплярам"

И, конечно, все работает, если я добавлю_OBJC_IVAR _ $ _ PluginBase.fConn в файл экспорта ... но только для 64-битной сборки 32-битная не знает о таких вещах: "Неопределенные символы:" _OBJC_IVAR _ $ _ PluginBase.fConn ", на которые ссылается: -exported_symbol [s_list] параметр командной строки "

Единственное решение кажется другим обходным путем: иметь два файла экспорта.Но ... Я не могу использовать «Добавить условие настройки сборки» для параметра EXPORTED_SYMBOLS_FILE: -S.

Есть идеи (кроме использования методов открытого доступа)?

1 Ответ

2 голосов
/ 24 декабря 2011

Вы можете настроить архитектуру с помощью файлов xcconfig. Похоже, что это невозможно через графический интерфейс. Создайте файл конфигурации сборки, содержащий следующее:

EXPORTED_SYMBOLS_FILE[arch=i386]=$(SRCROOT)/SymbolsList32Bit
EXPORTED_SYMBOLS_FILE[arch=x86_64]=$(SRCROOT)/SymbolsList64Bit

, а затем в настройках проекта установите этот файл в качестве конфигурации сборки для проекта, и вам будет хорошо. (Очевидно, вам придется указывать пути к вашим файлам, но, надеюсь, вы поймете идею.)

Это сработало для меня. (FWIW вы также можете использовать для имени SDK, например, MY_SETTING [sdk = iphoneos *] = FOO, MY_SETTING [sdk = mac ] = BAR и т. Д.)

Надеюсь, это поможет!

...