[CMake] patch : Qt Static on windows

John Biddiscombe biddisco at cscs.ch
Fri May 12 08:39:13 EDT 2006


I've submitted earlier a new bug report
---------
#bug3222
Building QT as a static build on windows causes Qvtk and anything else
that uses Qt to fail due to linker errors.
The reason is because the Find and UseQt4 scripts set all the
-DQT_CORE_LIB flags so that the exports are declared as DLL type and the
static link fails.

Also additional libs are required when linking against Qt static

   IF (WIN32 AND QT_STATIC)
     TARGET_LINK_LIBRARIES( QVTKWidgetPlugin Imm32 Winmm Ws2_32)
   ENDIF (WIN32 AND QT_STATIC)
------------

Attached is a patch which fixes the problem on my system.
In Find Qt we Glob the QT_BINARY_DIR and if there are no DLLs in there, 
we can probably assume it was a static build. We Set QT_STATIC and then 
in UseQt we do not set the CORE_LIB, GUI_LIB etc flags if we are static, 
thus preventing bogus link. Also suppress QT_DLL if static.

If anyone knows of a better way of checking for QT_STATIC other than 
searching for DLL's - I can't find a QMake - query that will tell me

Please check patch and apply.

JB

-- 
John Biddiscombe,                            email:biddisco @ cscs.ch
http://www.cscs.ch/about/BJohn.php
CSCS, Swiss National Supercomputing Centre  | Tel:  +41 (91) 610.82.07
Via Cantonale, 6928 Manno, Switzerland      | Fax:  +41 (91) 610.82.82


-------------- next part --------------
Index: Modules/FindQt4.cmake
===================================================================
RCS file: /cvsroot/CMake/CMake/Modules/FindQt4.cmake,v
retrieving revision 1.30
diff -u -r1.30 FindQt4.cmake
--- Modules/FindQt4.cmake	11 May 2006 14:41:42 -0000	1.30
+++ Modules/FindQt4.cmake	12 May 2006 12:35:09 -0000
@@ -167,10 +167,6 @@
 
 SET( QT_DEFINITIONS "")
 
-IF (WIN32)
-  SET(QT_DEFINITIONS -DQT_DLL)
-ENDIF(WIN32)
-
 # check for qmake
 FIND_PROGRAM(QT_QMAKE_EXECUTABLE NAMES qmake qmake-qt4 PATHS
   "[HKEY_CURRENT_USER\\Software\\Trolltech\\Qt3Versions\\4.0.0;InstallDir]/bin"
@@ -854,6 +850,20 @@
     SET(QT_QTCORE_LIBRARY ${QT_QTCORE_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
   ENDIF(UNIX)
 
+  #######################################
+  #
+  #       if Qt Static build on windows,
+  #
+  #######################################
+  IF (WIN32)
+    # if ther are no DLL's in the bin dir, it must be a static build, yes?
+    FILE(GLOB DLLS ${QT_BINARY_DIR}/*.dll)
+    IF(NOT DLLS)
+      SET(QT_STATIC 1)
+    ELSE(NOT DLLS)
+      SET(QT_DEFINITIONS -DQT_DLL)
+    ENDIF(NOT DLLS)
+  ENDIF(WIN32)
 
   #######################################
   #
Index: Modules/UseQt4.cmake
===================================================================
RCS file: /cvsroot/CMake/CMake/Modules/UseQt4.cmake,v
retrieving revision 1.4
diff -u -r1.4 UseQt4.cmake
--- Modules/UseQt4.cmake	27 Apr 2006 19:07:23 -0000	1.4
+++ Modules/UseQt4.cmake	12 May 2006 08:27:22 -0000
@@ -13,7 +13,9 @@
 IF (NOT QT_DONT_USE_QTCORE)
   IF (QT_QTCORE_FOUND)
     INCLUDE_DIRECTORIES(${QT_QTCORE_INCLUDE_DIR})
-    ADD_DEFINITIONS(-DQT_CORE_LIB)
+    IF(NOT QT_STATIC)
+      ADD_DEFINITIONS(-DQT_CORE_LIB)
+    ENDIF(NOT QT_STATIC)
     IF (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
       SET(QT_LIBRARIES ${QT_LIBRARIES}
         optimized "${QT_QTCORE_LIBRARY}"
@@ -35,7 +37,9 @@
 IF (NOT QT_DONT_USE_QTGUI)
   IF (QT_QTGUI_FOUND)
     INCLUDE_DIRECTORIES(${QT_QTGUI_INCLUDE_DIR})
-    ADD_DEFINITIONS(-DQT_GUI_LIB)
+    IF(NOT QT_STATIC)
+      ADD_DEFINITIONS(-DQT_GUI_LIB)
+    ENDIF(NOT QT_STATIC)
     IF (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
       SET(QT_LIBRARIES ${QT_LIBRARIES}
         optimized "${QT_QTGUI_LIBRARY}"
@@ -57,7 +61,9 @@
 IF (QT_USE_QT3SUPPORT)
   IF (QT_QT3SUPPORT_FOUND)
     INCLUDE_DIRECTORIES(${QT_QT3SUPPORT_INCLUDE_DIR})
-    ADD_DEFINITIONS(-DQT3_SUPPORT)
+    IF(NOT QT_STATIC)
+      ADD_DEFINITIONS(-DQT3_SUPPORT)
+    ENDIF(NOT QT_STATIC)
     IF (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
       SET(QT_LIBRARIES ${QT_LIBRARIES}
         optimized "${QT_QT3SUPPORT_LIBRARY}"
@@ -135,7 +141,9 @@
 IF (QT_USE_QTNETWORK)
   IF (QT_QTNETWORK_FOUND)
     INCLUDE_DIRECTORIES(${QT_QTNETWORK_INCLUDE_DIR})
-    ADD_DEFINITIONS(-DQT_NETWORK_LIB)
+    IF(NOT QT_STATIC)
+      ADD_DEFINITIONS(-DQT_NETWORK_LIB)
+    ENDIF(NOT QT_STATIC)
     IF (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
       SET(QT_LIBRARIES ${QT_LIBRARIES}
         optimized "${QT_QTNETWORK_LIBRARY}"
@@ -168,7 +176,9 @@
 IF (QT_USE_QTOPENGL)
   IF (QT_QTOPENGL_FOUND)
     INCLUDE_DIRECTORIES(${QT_QTOPENGL_INCLUDE_DIR})
-    ADD_DEFINITIONS(-DQT_OPENGL_LIB)
+    IF(NOT QT_STATIC)
+      ADD_DEFINITIONS(-DQT_OPENGL_LIB)
+    ENDIF(NOT QT_STATIC)
     IF (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
       SET(QT_LIBRARIES ${QT_LIBRARIES}
         optimized "${QT_QTOPENGL_LIBRARY}"
@@ -185,7 +195,9 @@
 IF (QT_USE_QTSQL)
   IF (QT_QTSQL_FOUND)
     INCLUDE_DIRECTORIES(${QT_QTSQL_INCLUDE_DIR})
-    ADD_DEFINITIONS(-DQT_SQL_LIB)
+    IF(NOT QT_STATIC)
+      ADD_DEFINITIONS(-DQT_SQL_LIB)
+    ENDIF(NOT QT_STATIC)
     IF (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
       SET(QT_LIBRARIES ${QT_LIBRARIES}
         optimized "${QT_QTSQL_LIBRARY}"
@@ -202,7 +214,9 @@
 IF (QT_USE_QTXML)
   IF (QT_QTXML_FOUND)
     INCLUDE_DIRECTORIES(${QT_QTXML_INCLUDE_DIR})
-    ADD_DEFINITIONS(-DQT_XML_LIB)
+    IF(NOT QT_STATIC)
+      ADD_DEFINITIONS(-DQT_XML_LIB)
+    ENDIF(NOT QT_STATIC)
     IF (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
       SET(QT_LIBRARIES ${QT_LIBRARIES}
         optimized "${QT_QTXML_LIBRARY}"


More information about the CMake mailing list