2017-01-20 1 views
0

Je travaille sur un projet Qt développé sous Linux, mais qui a aussi une construction Windows liée statiquement. Je peux le construire sur Linux et Windows en utilisant le même fichier CMakeLists.txt. Il se décompose en:Liaison statique contre Qt sous Windows en utilisant CMake

project(muckturnier) 
set(CMAKE_CXX_STANDARD 11) 
set(CMAKE_CXX_REQUIRED TRUE) 
find_package(Qt5 COMPONENTS Widgets Sql) 
include_directories(${Qt5Widgets_INCLUDES} ${Qt5Sql_INCLUDES}) 
set(CMAKE_AUTOMOC ON) 
set(muckturnier_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/SomeCode.cpp) 
add_executable(muckturnier ${muckturnier_SRCS}) 
target_link_libraries(muckturnier ${Qt5Widgets_LIBRARIES} ${Qt5Sql_LIBRARIES}) 

Mais je n'ai pas encore réussi à faire une compilation statique sous Windows via CMake. Quand je tournerai manuellement respectif comprennent dirs, tout se construit bien, mais je reçois une erreur de liaison à la fin:

[100%] Linking CXX executable muckturnier.exe 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x228d): 
undefined reference to `hb_buffer_create' 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x22a4): 
undefined reference to `hb_buffer_set_unicode_funcs' 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x22b7): 
undefined reference to `hb_buffer_pre_allocate' 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x22bf): 
undefined reference to `hb_buffer_allocation_successful' 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x23ef): 
undefined reference to `hb_buffer_clear_contents' 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x241f): 
undefined reference to `hb_buffer_add_utf16' 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x2432): 
undefined reference to `hb_buffer_set_segment_properties' 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x243a): 
undefined reference to `hb_buffer_guess_segment_properties' 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x2455): 
undefined reference to `hb_buffer_set_flags' 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x2555): 
undefined reference to `hb_shape_full' 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x2578): 
undefined reference to `hb_buffer_get_length' 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x258c): 
undefined reference to `hb_buffer_destroy' 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x264a): 
undefined reference to `hb_buffer_get_glyph_infos' 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x2662): 
undefined reference to `hb_buffer_get_glyph_positions' 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x28f8): 
undefined reference to `hb_buffer_reverse' 
C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o):qtextengine.cpp:(.text+0x2941): 
undefined reference to `hb_buffer_destroy' 
C:/Qt/Tools/mingw492_32/bin/../lib/gcc/i686-w64-mingw32/4.9.2/../../../../i686-w 
64-mingw32/bin/ld.exe: C:/Qt/5.6_static/lib/libQt5Gui.a(qtextengine.o): bad relo 
c address 0x7a in section `.text$_ZN7QVectorIN11QTextLayout11FormatRangeEEaSERKS 
2_[__ZN7QVectorIN11QTextLayout11FormatRangeEEaSERKS2_]' 
collect2.exe: error: ld returned 1 exit status 
CMakeFiles\muckturnier.dir\build.make:424: recipe for target 'muckturnier.exe' f 
ailed 
mingw32-make[2]: *** [muckturnier.exe] Error 1 
CMakeFiles\Makefile2:141: recipe for target 'CMakeFiles/muckturnier.dir/all' fai 
led 
mingw32-make[1]: *** [CMakeFiles/muckturnier.dir/all] Error 2 
makefile:82: recipe for target 'all' failed 
mingw32-make: *** [all] Error 2 

C'est pourquoi j'ai créé le fichier qmake pour faire la construction statique. Celui-ci se déshabille à:

QMAKE_CXXFLAGS += -std=c++11 
CONFIG += qt 
CONFIG += static 
QT += widgets 
QT += sql 
HEADERS += SomeCode.h 
SOURCES += SomeCode.cpp 
TARGET = muckturnier 

En utilisant qmake (à partir du Qt statique), je peux faire l'électricité statique sans problème. Donc, ma construction Qt statique est très bien, et c'est un problème CMake.

Quel est le problème ici? Merci pour toute l'aide!

+2

Essayez d'utiliser Qt5_INCLUDES et Qt5_LIBRARIES à la place des bibliothèques et modules inclus dans le module. En outre, lors de la construction avec qmake, regardez les commandes exécutées et notez la liste des bibliothèques Qt liées. Cela peut vous donner des indices. –

+0

Que se passe-t-il si vous utilisez 'qt5_use_modules (muckturnier Widgets Sql)' au lieu de 'target_link_libraries (...)'? –

+1

Selon http://doc.qt.io/qt-5/cmake-manual.html, cette macro ne doit être utilisée avec d'anciennes versions de cmake que si je l'ai lu correctement? J'ai utilisé le stable actuel. Je crains peppe ci-dessous a raison et c'est un bug ... Je vais vérifier cela. –

Répondre

1

Je pense que vous êtes une victime de this bug (toujours non résolue). Je ne suis pas sûr à 100% de ce qui ne va pas, mais vous pouvez trouver quelques idées dans les commentaires.

+0

Ce bug ressemble beaucoup à ce que je reçois ... ce n'est pas exactement la même chose, mais vous avez probablement raison! –