[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