Подтвердить что ты не робот

"Символ (ы), не найденный для архитектуры x86_64" в проекте QtCreator

Я получаю сообщение об ошибке

Symbol(s) not found for architecture x86_64

Попытка скомпилировать проект на QtCreator. Это происходит, когда я пытаюсь создать экземпляр класса, определенного пользователем, Layer. Этот класс состоит из заголовка, layer.h и реализации, layer.cpp. Он был протестирован и работает в других программах. В моем проекте он включен в qtwidget.h, и ошибка возникает, когда я пытаюсь использовать его на qtwidget.cpp. Например:

Layer<double> text("pq.txt",0.5,0.5,0.5);

Для этой ошибки достаточно указать эту строку на qtwidget.cpp.

Это такая общая ошибка, что я не знаю, как ее изолировать, но если это поможет, я включил весь проект в этот git репо.

4b9b3361

Ответ 1

На мой взгляд, сообщение об ошибке, которое показывает Qt Creator, довольно вводит в заблуждение, пока вы его не поймете, но не препятствует разбиению класса шаблона на заголовок и файл реализации. Если вы думаете о сообщении:

Symbol(s) not found for architecture x86_64

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

Если вы перейдете из окна "Проблемы в окно компиляции" и прокрутите вверх, вы сможете точно увидеть, какие символы не могут быть найдены; шахта отображается красным цветом. Это просто раздражает, что деталь отсутствующего символа (ов) не отображается в представлении "Проблемы" .

Легко реплицировать эту ошибку, просто добавив определение функции в заголовок и не выполняя эту функцию, вызовите ее из файла .cpp. Затем вы увидите что-то подобное в окне "Проблемы"

symbol not found

Переключение на представление Compile Output и прокрутку отображают следующее: -

enter image description here

Итак, теперь мы видим, что фактическая проблема заключается в том, что функция DoSomeStuff в классе PGGui вызывается из конструктора PGGui:: PGGui, но тело DoSomeStuff отсутствует, так как его символ не найден.

Ответ 2

К счастью, мне удалось решить мою проблему перед любыми ответами, поэтому, если кто-то испытывает что-то похожее, проблема заключалась в том, что вам кажется, что не может разбить шаблонный класс на .cpp и .h файл. Возврат всех объявлений файла .cpp обратно в .h решил проблему.

У меня все еще осталась проблема: дублированные символы (по этой причине я ее разложил). На этот раз, объявив переменную как external в .h, и ее повторное использование без ключевого слова external в одном (и только одном) файле .cpp решило проблему.

Ответ 3

Для меня эта проблема возникла из-за того, что не удалось восстановить файл make после добавления другого исходного файла и заголовка.

Under Build: Cleanall- > run qMake- > run

исправил ошибку для меня.

Ответ 4

В моем случае проблема заключалась в том, что у меня был проект со многими подпроектами, и один из pro файлов подпроектов был пуст.