4 votes

QT 5.6 static symbole externe non résolu

Je développe une petite application utilisant un QWidget et liant statiquement Qt 5.6. J'utilise VS12 pour le moment.

#include <QMainWindow>
#include <QApplication>

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  QMainWindow w;
  w.show();

  return a.exec();
}

Il se compile bien mais j'obtiens des erreurs de l'éditeur de liens.

1>libGLESv2d.lib(global_state.obj) : error LNK2019: unresolved external symbol "unsigned long __cdecl CreateTLSIndex(void)" (?CreateTLSIndex@@YAKXZ) referenced in function "struct A0x6526a104::Current * __cdecl `anonymous namespace'::GetCurrentData(void)" (?GetCurrentData@?A0x6526a104@@YAPAUCurrent@1@XZ)
1>libGLESv2d.lib(global_state.obj) : error LNK2019: unresolved external symbol "bool __cdecl DestroyTLSIndex(unsigned long)" (?DestroyTLSIndex@@YA_NK@Z) referenced in function _DllMain_ANGLE@12
1>libGLESv2d.lib(global_state.obj) : error LNK2019: unresolved external symbol "bool __cdecl SetTLSValue(unsigned long,void *)" (?SetTLSValue@@YA_NKPAX@Z) referenced in function "struct A0x6526a104::Current * __cdecl `anonymous namespace'::AllocateCurrent(void)" (?AllocateCurrent@?A0x6526a104@@YAPAUCurrent@1@XZ)
1>libGLESv2d.lib(global_state.obj) : error LNK2019: unresolved external symbol "void * __cdecl GetTLSValue(unsigned long)" (?GetTLSValue@@YAPAXK@Z) referenced in function "void __cdecl `anonymous namespace'::DeallocateCurrent(void)" (?DeallocateCurrent@?A0x6526a104@@YAXXZ)
1>libGLESv2d.lib(Program.obj) : error LNK2019: unresolved external symbol "bool __cdecl sh::InterpolationTypesMatch(enum sh::InterpolationType,enum sh::InterpolationType)" (?InterpolationTypesMatch@sh@@YA_NW4InterpolationType@1@0@Z) referenced in function "private: static bool __cdecl gl::Program::linkValidateVaryings(class gl::InfoLog &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,struct sh::Varying const &,struct sh::Varying const &)" (?linkValidateVaryings@Program@gl@@CA_NAAVInfoLog@2@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABUVarying@sh@@2@Z)
1>libGLESv2d.lib(Program.obj) : error LNK2019: unresolved external symbol "public: struct sh::ShaderVariable & __thiscall sh::ShaderVariable::operator=(struct sh::ShaderVariable const &)" (??4ShaderVariable@sh@@QAEAAU01@ABU01@@Z) referenced in function "private: bool __thiscall gl::Program::linkAttributes(class gl::InfoLog &,class gl::AttributeBindings const &,class gl::Shader const *)" (?linkAttributes@Program@gl@@AAE_NAAVInfoLog@2@ABVAttributeBindings@2@PBVShader@2@@Z)
1>libGLESv2d.lib(Program.obj) : error LNK2019: unresolved external symbol "public: __thiscall sh::Attribute::Attribute(void)" (??0Attribute@sh@@QAE@XZ) referenced in function "public: __thiscall gl::Program::Program(class rx::ProgramImpl *,class gl::ResourceManager *,unsigned int)" (??0Program@gl@@QAE@PAVProgramImpl@rx@@PAVResourceManager@1@I@Z)
1>libGLESv2d.lib(Program.obj) : error LNK2019: unresolved external symbol "public: __thiscall sh::Attribute::~Attribute(void)" (??1Attribute@sh@@QAE@XZ) referenced in function "public: __thiscall gl::Program::Program(class rx::ProgramImpl *,class gl::ResourceManager *,unsigned int)" (??0Program@gl@@QAE@PAVProgramImpl@rx@@PAVResourceManager@1@I@Z)
1>libGLESv2d.lib(ProgramImpl.obj) : error LNK2001: unresolved external symbol "public: __thiscall sh::Attribute::~Attribute(void)" (??1Attribute@sh@@QAE@XZ)
1>libGLESv2d.lib(Program.obj) : error LNK2019: unresolved external symbol "public: struct sh::Attribute & __thiscall sh::Attribute::operator=(struct sh::Attribute const &)" (??4Attribute@sh@@QAEAAU01@ABU01@@Z) referenced in function "void __cdecl std::_Fill<struct sh::Attribute *,struct sh::Attribute>(struct sh::Attribute *,struct sh::Attribute *,struct sh::Attribute const &)" (??$_Fill@PAUAttribute@sh@@U12@@std@@YAXPAUAttribute@sh@@0ABU12@@Z)

J'ai inclus les librairies suivantes :

winmm.lib
imm32.lib
Ws2_32.lib
opengl32.lib
Qt5Guid.lib
Qt5Widgetsd.lib
qtpcred.lib
qtharfbuzzngd.lib
Qt5PlatformSupportd.lib
qwindowsd.lib
libEGLd.lib
libGLESv2d.lib
qtfreetyped.lib
Qt5Cored.lib

Et le plus drôle, c'est que si l'on utilise QtCreator, il se compile, se lie et s'exécute très bien. Ce que j'ai vu, c'est que QtCreator ajoute les drapeaux de compilation suivants :

-DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_OPENGL_ES_2 -DQT_OPENGL_ES_2_ANGLE -DQT_OPENGL_ES_2_ANGLE_STATIC -DGL_APICALL= -DEGLAPI=

Je les ai essayées dans mon projet mais cela ne change rien. Que me manque-t-il ? De quoi ai-je besoin pour relier le programme ?

1voto

Felix Schindler Points 52

Je l'ai trouvé. Voici la liste des librairies dont vous avez besoin pour le faire fonctionner :

winmm.lib
imm32.lib
Ws2_32.lib
Qt5Guid.lib
Qt5Widgetsd.lib
qtpcred.lib
qtharfbuzzngd.lib
Qt5PlatformSupportd.lib
qwindowsd.lib
libEGLd.lib
libGLESv2d.lib
qtfreetyped.lib
Qt5Cored.lib
+ preprocessord.lib
+ translatord.lib
+ d3d9.lib
+ dxguid.lib

opengl32.lib n'est pas nécessaire. Je n'ai toujours pas compris pourquoi QtCreator sait quelles librairies sont nécessaires et pourquoi VS2013 ne le sait pas. Merci pour votre aide.

0voto

nonsensickle Points 1672

Pour autant que je puisse en juger, l'auteur du lien se plaint de ce qui suit cette ligne de code . En regardant ce que contient ce fichier semble suggérer une dépendance à l'égard des libANGLE .

Après de nombreuses recherches sur Google, j'ai découvert que CreateTLS() semble être défini dans libANGLE commun qui peut être trouvée aquí .

Je ne suis pas sûr de savoir dans quelle librairie ou DLL particulière ces définitions se retrouvent, mais en regardant dans les scripts de la compilation, on le découvrirait certainement. (désolé, je n'ai pas le temps de le faire pour l'instant) . Mais les symboles mentionnés dans la question initiale se trouvent certainement dans l'une des librairies fournies par libANGLE.

cette page suggère qu'il suffit d'ajouter libEGLd.lib y libGLESv2.lib à votre ligne de liaison, ce qui est déjà le cas, mais vous devriez vérifier que vous avez également les DLL. Note point 3, citée dans la page liée , ci-dessous :

  1. Copiez libEGL.dll et libGLESv2.dll du répertoire de sortie de la construction (voir Construction d'ANGLE) dans le dossier de votre application.

Si vous ajoutez les DLL à votre solution, vous pouvez automatiser leur copie dans le répertoire de destination. .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X