2015-07-26 2 views
6

У меня есть проект Qt, который использует OpenGL и компилируется с Qt 5.4.0. Сегодня я обновил свой Qt до 5.5.0, и мой проект прекратил компиляцию. Он выбрасывает много unresolved external symbol ошибок, как вы можете увидеть здесь:Qt 5.5.0 не может найти функции OpenGL

link /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /MANIFEST:embed /OUT:debug\UI.exe @C:\Users\DWilches\AppData\Local\Temp\UI.exe.376.5500.jom 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::paintGL(void)" ([email protected]@@UAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::initializeGL(void)" ([email protected]@@UAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::paintGL(void)" ([email protected]@@UAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "private: void __thiscall UIOpenGLVisualizer::PaintScene(void)" ([email protected]@@AAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::paintGL(void)" ([email protected]@@UAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::paintGL(void)" ([email protected]@@UAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall UIOpenGLVisualizer::NewSelectionPerformed(void)" ([email protected]@@QAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::initializeGL(void)" ([email protected]@@UAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::initializeGL(void)" ([email protected]@@UAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall UIOpenGLVisualizer::NewSelectionPerformed(void)" ([email protected]@@QAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::initializeGL(void)" ([email protected]@@UAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::initializeGL(void)" ([email protected]@@UAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::initializeGL(void)" ([email protected]@@UAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall UIOpenGLVisualizer::NewSelectionPerformed(void)" ([email protected]@@QAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall UIOpenGLVisualizer::NewSelectionPerformed(void)" ([email protected]@@QAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall UIOpenGLVisualizer::NewSelectionPerformed(void)" ([email protected]@@QAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall UIOpenGLVisualizer::NewSelectionPerformed(void)" ([email protected]@@QAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall UIOpenGLVisualizer::NewSelectionPerformed(void)" ([email protected]@@QAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::paintGL(void)" ([email protected]@@UAEXXZ) 
UIOpenGLVisualizer.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: virtual void __thiscall UIOpenGLVisualizer::paintGL(void)" ([email protected]@@UAEXXZ) 
debug\UI.exe : fatal error LNK1120: 20 unresolved externals 
jom: C:\Users\DWilches\Desktop\3DIA\VolumeSelector\VVSIT\build-VVSIT-Desktop_Qt_5_5_0_MSVC2013_32bit-Debug\UI\Makefile.Debug [debug\UI.exe] Error 1120 
jom: C:\Users\DWilches\Desktop\3DIA\VolumeSelector\VVSIT\build-VVSIT-Desktop_Qt_5_5_0_MSVC2013_32bit-Debug\UI\Makefile [debug] Error 2 
21:35:43: The process "C:\ProgramFiles\Qt\Qt5.5.0\Tools\QtCreator\bin\jom.exe" exited with code 2. 
Error while building/deploying project VVSIT (kit: Desktop Qt 5.5.0 MSVC2013 32bit) 
When executing step "Make" 

Я не изменил .pro файлов между одной и другой версией Qt. И мой .pro также имеет строку, которая гласит:

QT += opengl 

Что может быть неправильным?

+2

Вам необходимо передать 'opengl32.lib' для связи. Вы используете файл ответов, поэтому вы хотите разместить его вместо командной строки, и я не знаю, как использовать ваш конкретный инструмент для управления файлом ответов, но 'opengl32.lib' является где эти функции найдены. –

+0

Да, спасибо, я добавил -lopengl32, и теперь он работает. Интересно, почему теперь это необходимо с этой новой версией Qt, пока раньше это не делалось автоматически: QT + = opengl. Не могли бы вы добавить это как ответ? – MondKin

+0

Я понятия не имею, что 'QT + = opengl' делает или не делает в разных версиях, поэтому любой ответ, который я пишу, будет не совсем полным. Почему бы вам не написать собственный ответ, показывающий, как/где вы добавили этот '-lopengl32', чтобы он отлично играл с процессом сборки Qt? –

ответ

11

Как разоблачена @ Бен-Фойгта в комментариях выше, я должен был явно проинструктировать Qt, чтобы связать против opengl32, поэтому я добавил следующее в моих .pro:

LIBS += -lopengl32 

Я не знаю, почему есть изменения в поведении в Qt 5.5.0, поскольку эта строка не нужна в предыдущих версиях, но она решает эту проблему.

+0

Если бы я должен был догадаться, в qt была жестко закодированная проверка, чтобы заменить 'opengl' на соответствующую системную библиотеку, и так или иначе, что было разбито в 5.5. Однако я не использую qt (или opengl), так что это просто предположение. Я бы сообщил об этом как об ошибке на своих форумах. – Blindy

+0

@Blindy: В OpenGL нет такой вещи, как системная библиотека (да, я знаю, что в Linux собственные проприетарные драйверы устанавливают свои собственные libgL.so). ABI OS, в которых поддерживается OpenGL, и любая DLL/SO, которая следует за этими ABI, будет связываться во время исполнения с вашей программой просто отлично (предполагая, что сама программа также относится к ABI). – datenwolf

+0

@ Блинди: Я думаю, что что-то вроде того, что вы сказали, произошло, проверьте это: http://blog.qt.io/blog/2015/07/01/qt-5-5-released/, особенно: _Using OpenGL on Windows всегда была несколько проблематичной, так как хорошие драйверы по умолчанию не доступны во всех установках. Qt 5.5 помогает решить эту проблему, динамически переключаясь между использованием OpenGL-драйвера или уровнем эмуляции ANGLE, реализующим OpenGL поверх DirectX._ – MondKin

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