"Символ (ы), не найденный для архитектуры 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 репо.
Ответы
Ответ 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 файлов подпроектов был пуст.