символ (ы), не найденный для архитектуры x86_64 в Xcode 9 [дубликат]

Вы никогда не можете передавать по ссылке в Java, и одним из очевидных способов является то, что вы хотите вернуть более одного значения из вызова метода. Рассмотрим следующий бит кода в C ++:

void getValues(int& arg1, int& arg2) {
    arg1 = 1;
    arg2 = 2;
}
void caller() {
    int x;
    int y;
    getValues(x, y);
    cout << "Result: " << x << " " << y << endl;
}

Иногда вы хотите использовать тот же шаблон в Java, но вы не можете; по крайней мере, не напрямую. Вместо этого вы можете сделать что-то вроде этого:

void getValues(int[] arg1, int[] arg2) {
    arg1[0] = 1;
    arg2[0] = 2;
}
void caller() {
    int[] x = new int[1];
    int[] y = new int[1];
    getValues(x, y);
    System.out.println("Result: " + x[0] + " " + y[0]);
}

Как было объяснено в предыдущих ответах, в Java вы передаете указатель на массив как значение в getValues. Этого достаточно, потому что метод затем модифицирует элемент массива, и по соглашению вы ожидаете, что элемент 0 будет содержать возвращаемое значение. Очевидно, вы можете сделать это другими способами, такими как структурирование вашего кода, чтобы это не было необходимо, или создание класса, который может содержать возвращаемое значение или разрешить его установку. Но простой шаблон, доступный вам в C ++ выше, недоступен на Java.

112
задан Bruce Wayne 1 June 2016 в 02:45
поделиться

16 ответов

Похоже, что вы отсутствуете, включая IOBluetooth.framework в своем проекте. Вы можете добавить его по:

-Нажмите на свой проект в левом верхнем углу левой панели (синий значок).

. На средней панели щелкните вкладку «Фазы построения».

-Включить «Связывание двоичных файлов с библиотеками», нажмите кнопку «плюс».

-Закройте IOBluetooth.framework из списка и нажмите Добавить.

enter image description here [/g0]

enter image description here [/g1]

Это позволит убедиться, что определения IOBluetooth.framework найдены компоновщиком , Вы можете видеть, что фреймворк является членом вашей цели, щелкнув фреймворк в левой панели и увидев целевое членство структуры в правой панели (обратите внимание, что я переместил структуру в группе Frameworks для целей организации):

enter image description here [/g2]

95
ответ дан python 22 August 2018 в 22:23
поделиться

Я обнаружил, что это также может произойти, если вы перетащите папку с файлами Objective-C в свой проект. Если эта папка кажется синей, я думаю, что она указывает, что она не связана должным образом. Вы можете проверить это (если вы используете контроль версий), потому что всякий раз, когда вы добавляете новые файлы, файл pbxproj должен обновляться ссылками на эти новые файлы. Однако вы можете обнаружить, что после того, как вы добавили папку, которую файл pbxproj не изменил (и, следовательно, есть ошибка связывания). Таким образом, вы получите автоматическое завершение работы, и он найдет классы, которые вы импортировали, но когда это происходит, чтобы фактически создать образ, с которым он не справляется с этим кодом ошибки.

Решение состоит в том, чтобы не добавлять папку, а скорее добавьте файлы. Сделайте это, и вы увидите обновление файла pbxproj, и оно должно исправить эту ошибку.

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

4
ответ дан Aggressor 22 August 2018 в 22:23
поделиться

У меня была такая же ошибка, потому что вместо удаления файла я просто удалял ссылки на него. Поиск файла в Finder и его удаление помогли.

3
ответ дан Alatoo 22 August 2018 в 22:23
поделиться

UPD

Apple требует использовать архитектуру arm64. Не используйте библиотеки x32 в вашем проекте

Итак, ниже ответ неверен!


Старый ответ

Новый Xcode 5.1 устанавливает архитектуру armv7, armv7s и arm64.

И иногда ошибка «сбой сборки» Неопределенные символы для архитектуры x86_64 «» могут быть вызваны этим. Потому что некоторые библиотеки (а не Apple) были скомпилированы для x32 изначально и не поддерживают x64.

Итак, вам нужно изменить «Архитектуры» для вашего целевого проекта, например

NB. Если вы используете Cocoapods - вы должны сделать то же самое для цели «Pods».

enter image description here [/g0]

48
ответ дан Aleksey Potapov 22 August 2018 в 22:23
поделиться

Я также видел эту ошибку в Xcode 7.2, когда производные данные повреждаются (в моем случае я прервал сборку и подозревал, что это была основная причина).

Итак, если другие решения (в частности, Chris's и BraveS, которые, как я подозреваю, более вероятны) не подходят вашей проблеме, попробуйте удалить производные данные (выберите: Окно / Проекты / Производные данные -> Удалить) и перестроить.

(Добавлен для справки другими - Я знаю, что на исходный вопрос был дан правильный ответ.)

15
ответ дан Ali Beadle 22 August 2018 в 22:23
поделиться

Неопределенные символы для архитектуры x86_64: «_OBJC_CLASS _ $ _ xxx», на которые ссылается: objc-class-ref в yyy.o

Это обычно означает, что вы вызываете «xxx» "(это может быть каркас или класс) из класса" yyy ". Компилятор не может найти «xxx», чтобы произошла эта ошибка.

Вам нужно добавить отсутствующие файлы (в данном случае «xxx»), щелкнув правой кнопкой мыши по папке проекта в окне навигатора и коснитесь «Добавить файлы в» YourProjectName "" вариант.

Всплывающее окно откроет ваши файлы проекта в Finder. Там вы можете увидеть недостающие файлы и просто добавить их в свой проект. Не забудьте проверить флажок «Копировать предметы в случае необходимости». Удачи !!

23
ответ дан Confused 22 August 2018 в 22:23
поделиться

Для меня это произошло после конфликта слиянием.

Я попытался очистить и удалить папку сборки, но ни одна из них не помогла. Эта проблема продолжалась независимо. Затем я повторно связал ссылку, удалив группы, которые были проблематичными и повторно добавлены в проект, и это сработало.

0
ответ дан green0range 22 August 2018 в 22:23
поделиться

Если вы получаете эту ошибку при попытке ссылки на файл C, сначала дважды проверьте имена функций для опечаток. Затем дважды проверьте, что вы не пытаетесь вызвать функцию C из среды C ++ / Objective-C ++ без использования конструкции extern C {}. Я рвал волосы, потому что у меня был класс, который был в файле .mm, который пытался вызвать функции C. Это не работает, потому что в C ++ символы искажены. Фактически вы можете увидеть конкретные символы, созданные с помощью инструмента nm. Terminal на путь к файлам .o и запустите nm -g в файле, который вызывает символ, и тот, который должен иметь этот символ, и вы должны увидеть, совпадают ли они или нет, что может дать ключ к ошибке .

nm -g file.o

Вы можете проверить символы C ++, которые были запятыми:

nm -gC file.o
1
ответ дан james_alvarez 22 August 2018 в 22:23
поделиться
1
ответ дан jeffreysuej 22 August 2018 в 22:23
поделиться

Я пробовал практически все, но моя проблема оказалась остатками предыдущей сборки cocoapods. Для меня это было:

  1. rm -Rf Pods; pod install
  2. Удалить исходные данные (окно / проекты ... выберите цель) нажмите кнопку «Удалить»)
  3. Восстановить
3
ответ дан lonesomewhistle 22 August 2018 в 22:23
поделиться

Также может быть #include <windows.h> в .c файле, который вы пытаетесь скомпилировать.

0
ответ дан Lorenzo Andraghetti 22 August 2018 в 22:23
поделиться

Я знаю, что это старый вопрос, но сегодня он получил ту же ошибку и не работал над этими решениями.

Исправил его, установив опцию:

Project -> Architecture -> Build Active Architecture Only

на Да

и компиляция и сборка проекта должным образом

0
ответ дан Raphael 22 August 2018 в 22:23
поделиться

В моем случае это была не библиотека, это были некоторые классы ..

Неопределенные символы для архитектуры x86_64: "_OBJC_CLASS _ $ _ ClassNmae", на которые ссылается: objc-class-ref in SomeClassName ".

d: символ не найден для архитектуры x86_64

clang: ошибка: команда компоновщика не удалась с кодом выхода 1 (используйте -v для просмотра вызова)

Решение У меня было несколько целей в Xcode с несколькими схемами (Production, Dev и т. д.). Некоторые из моих недавно добавленных реализаций (Class.m) отсутствовали в

Xcode-> Targets-> Build Phases-> Compile Sources

Поэтому мне пришлось добавить их вручную.

, тогда я смог бы скомпилировать и успешно выполнить сборку

9
ответ дан Udaya Sri 22 August 2018 в 22:23
поделиться

При обновлении до Xcode 7.1 вы можете увидеть этот тип ошибки, и он не может быть разрешен ни одним из приведенных выше ответов. Одним из симптомов в моем случае было то, что приложение работает на устройстве не в симуляторе. Вероятно, вы увидите огромное количество ошибок, связанных со значительной частью всех используемых вами фреймворков.

Исправление на самом деле довольно простое. Вам просто нужно удалить запись из параметра «Пути поиска в Ракурсе», найденного в разделе TARGETS> Build Settings> Search Paths (убедитесь, что выбрана вкладка «Все»)

Если вы видите другую запись (помимо $ (унаследованной)) для своей основной цели или вашей целевой цели, просто удалите неисправный путь из всех целей и перестройте.

4
ответ дан whyoz 22 August 2018 в 22:23
поделиться

В Xcode 9.0b5 вы можете столкнуться с этим, потому что Xcode 9.0b5 имеет ошибку в нем, где, когда вы добавляете исходный код, он не соблюдает целевые настройки. Вы должны войти и установить для каждого файла вручную следующие слова:

11
ответ дан William Cerniuk 22 August 2018 в 22:23
поделиться

Я также столкнулся с той же проблемой, описанные выше методы не будут работать. Я случайно удалил файлы в следующем каталоге на нем.

Или

~ / Библиотека / Разработчик / Xcode / DerivedData /

9
ответ дан ylgwhyh 22 August 2018 в 22:23
поделиться