2015-09-23 1 views
1

Я только что обновил приложение Xcode v6, Swift 1, iOS 7.1 для Xcode 7 и Swift 2.0, используя конвертер и выполняя некоторые инструкции изменения, чтобы избавиться от всех ошибок сборки, связанных с быстрыми файлами. Но я все еще получаю linker command failed with exit code 1 после того как я решал все вопросы ...Xcode 7, Swift 2.0 преобразование: «дублированный символ» и команда компоновщика не сработали с кодом выхода 1

Я пытался все решения я смог найти в сети, включая:

  • удалить настройки хостов в сборке в Test- переменные
  • пытался очистить все папки и строит в том числе полученных данных
  • пытались установить в NO битового кода
  • в toolbox-Bridging-Header.h я сделал #import <receiptValidationHelper.h>, а не файл .m

ничего из этого не решено.

Ошибка ссылка отображается после нескольких предупреждений являются:

duplicate symbol _global_bundleIdentifier in: 
/Users/soko/Library/Developer/Xcode/DerivedData/toolbox-bpiaqlzxdtrbqwekzouzpbfnqxaa/Build/Intermediates/toolbox.build/Debug-iphonesimulator/toolbox.build/Objects-normal/x86_64/receiptValidationHelper.o 
/Users/soko/Library/Developer/Xcode/DerivedData/toolbox-bpiaqlzxdtrbqwekzouzpbfnqxaa/Build/Intermediates/toolbox.build/Debug-iphonesimulator/toolbox.build/Objects-normal/x86_64/SwashTypeController.o 
.... 
ld: 67 duplicate symbols for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

код с global_bundleidentifier только в receiptValidationHelper.h глядя, как этот

const NSString *global_bundleVersion = @"1"; 
const NSString *global_bundleIdentifier = @"xxxx"; 

Как уже упоминалось выше, мое приложение Swift и я используйте эту константу и в быстром коде. Я импортировал файл .h в toolbox-Bridging-Header.h, используя #import <receiptValidationHelper.h>

Я также попытался переименовать const NSString *global_bundleIdentifier = @"xxx";, что приводит к той же ошибке с новым именем.

EDIT: Если я удалю все виды использования global_bundleIdentifier в моем Быстрого кода, ошибка исчезла! Кажется, что что-то новое в Swift 2.0 относительно использования переменных кода Objective-C. Кто-нибудь теперь точно, что я должен изменить?

+1

Можете ли вы разместить код, пожалуйста? В частности, код с 'global_bundleIdentifier'. – NobodyNada

+0

сделано. заранее спасибо. – Soko

ответ

3

Это проблема С, а не Быстрая. Ваша проблема в том, что глобальные переменные глобальны - к ним можно получить доступ всей программой. Объявление этих глобалов в заголовке заставляет их определять в каждом файле заголовок, путающий компоновщик, поскольку имеется 67 определений тех же констант.

Вам необходимо переместить определения в receiptValidationHelper.m, так что есть только одна глобально доступная копия каждой константы.

Однако, если вы просто переместить константы к ому, компилятор будет жаловаться в любом месте вы пытаетесь использовать их, так как он не может найти их, так что добавьте эти строки в receiptValidationHelper.h:

extern const NSString *global_bundleVersion; 
extern const NSString *global_bundleIdentifier; 

extern указывают компилятору: «Эй, эти константы определены где-то в другом месте». Затем компилятор действует так, как будто они существуют, и давайте связующим звеном с ним.

+0

отлично. это сработало. спасибо кучи. Однако остается один вопрос: почему это проблема сейчас? Точно такой же код был хорошо в Xcode 6 ... – Soko

+0

Я понятия не имею, почему это сработало в Xcode 6. – NobodyNada

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