[CMake] Help using CMake & Expat in Windows

Clark Taylor clark.n.taylor at gmail.com
Sat Jul 31 10:21:03 EDT 2010


This is very helpful.  Thank you!

My other question though is how can I get Cmake to add the correct
information into the visual studio solution.  Even though I have put in the
directory names in the cmake gui, I then have to add the same directories
manually to the solution.  Did I miss something simple.  To me the advantage
of cmake is that it automatically sets everything up for you in the Visual
Studio solutions, which is great.  However, even when I manually put in the
directories in the cmake-gui, it doesn't seem to add the information to the
solution.  With that information in there, I can definitely have it copy the
.dll to the correct location.

Thanks again for all your help.
Clark

On Sat, Jul 31, 2010 at 9:44 AM, Michael Jackson <
mike.jackson at bluequartz.net> wrote:

> On Fri, Jul 30, 2010 at 7:15 PM, John Drescher <drescherjm at gmail.com>
> wrote:
> >> I have created a very simple CMake file (I am a newbie) that works
> >> wonderfully in Linux, but am having problems in Windows.  The
> CMakeLists.txt
> >> is below
> >>
> >> #I think 2.6 is required for some of things I do below, but I am not
> sure
> >> CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
> >>
> >> # This is the CMake file for my application.  This
> >> # will be my first CMake file of decent size, so please excuse
> >> # any particularly bad syntax :)
> >> PROJECT(MyApp)
> >> FIND_PACKAGE(wxWidgets REQUIRED)
> >> FIND_PACKAGE(OpenCV REQUIRED)
> >> FIND_PACKAGE(EXPAT REQUIRED)
> >> INCLUDE (${wxWidgets_USE_FILE} ${OpenCV_USE_FILE} ${EXPAT_INCLUDE_DIRS})
> >>
> >> SET(Headers myApp.h myAppGUI.h myAppGUImpl.h Coordinates/Coordinates.h)
> >> SET(Src myApp.cpp myAppGUI.cpp myAppGUImpl.cpp
> Coordinates/Coordinates.cpp)
> >> ADD_EXECUTABLE(myApp ${Headers} ${Src})
> >> TARGET_LINK_LIBRARIES(myApp ${wxWidgets_LIBRARIES} ${OpenCV_LIBS}
> >> ${EXPAT_LIBRARIES})
> >>
> >> #End of code
> >>
> >> Everything works great in Linux, but when I try to use this in Windows,
> I
> >> have series of problems, all inter-related.
> >>
> >> Problem #1.  While wxWidgets and OpenCV work seamlessly, Cmake can't
> find
> >> the expat libraries.  (They are installed.  I installed the
> expat libraries
> >> using the basic windows download and install package).
> >
> > CMake rarely finds libraries on windows. The main reason is there is
> > no OS standard path for libraries or header files. For me its even
> > less likely to find stuff since I build on X: and not the same drive
> > as the OS. To fix this normally you run cmake-gui and it tells me it
> > can not find a package set the projectname_dir variable. After setting
> > this variable in cmake-gui all is well.
> >
> >>
> >> Problem #2.  While I can overcome problem #1 by hardcoding in where the
> >> expat include directory and library files are (setting the values in the
> >> CMake GUI), when I then open up the resulting solution in Visual Studio
> 2008
> >> Express and compile my code, the compiler gives the error "can't find
> >> expat.h"
> >>
> >
> > That is normally the correct solution.
> >
> >>
> >> Problem #3.  I can fix that problem as well by directly modifying the
> >> solution properties, but then when I run the project, it dies because it
> >> can't find libexpat.dll.
> >>
> > In your CMakeLists.txt have it copy the libexpat.dll to your debug,
> > release .. folder. Do that as a custom build step or an install step.
> >
> > Here are two ways I do this for Qt libraries (modify this for libexpat):
> >
> > The first uses an install.
> >
> > IF (WIN32)
> > IF (GET_RUNTIME)
> > INSTALL(FILES
> >                "${QT_BINARY_DIR}/QtCored${QT_VERSION_MAJOR}.dll"
> >                "${QT_BINARY_DIR}/QtXmld${QT_VERSION_MAJOR}.dll"
> >                "${QT_BINARY_DIR}/QtTestd${QT_VERSION_MAJOR}.dll"
> >                "${QT_BINARY_DIR}/QtGuid${QT_VERSION_MAJOR}.dll"
> >                "${QT_BINARY_DIR}/QtNetworkd${QT_VERSION_MAJOR}.dll"
> >                "${QT_BINARY_DIR}/QtScriptd${QT_VERSION_MAJOR}.dll"
> >                DESTINATION ${EXECUTABLE_OUTPUT_PATH}/Debug
> > )
> > INSTALL(FILES
> >                "${QT_BINARY_DIR}/QtCore${QT_VERSION_MAJOR}.dll"
> >                "${QT_BINARY_DIR}/QtXml${QT_VERSION_MAJOR}.dll"
> >                "${QT_BINARY_DIR}/QtTest${QT_VERSION_MAJOR}.dll"
> >                "${QT_BINARY_DIR}/QtGui${QT_VERSION_MAJOR}.dll"
> >                "${QT_BINARY_DIR}/QtNetwork${QT_VERSION_MAJOR}.dll"
> >                "${QT_BINARY_DIR}/QtScript${QT_VERSION_MAJOR}.dll"
> >                DESTINATION ${EXECUTABLE_OUTPUT_PATH}/RelWithDebInfo
> > )
> > ENDIF(GET_RUNTIME)
> > ENDIF(WIN32)
> >
> > The second uses a custom build step:
> >
> > # Copy the needed Qt libraries into the Build directory. Also add
> installation
> > # and CPack code to support installer generation.
> > # this is a complete hack for Visual Studio to copy the Qt libraries.
> > if ( NOT Q_WS_MAC)
> >   if (DEFINED QT_QMAKE_EXECUTABLE)
> >       SET (QTLIBLIST QtCore QtGui)
> >
> >       IF (MSVC)
> >           set(TYPE "d")
> >           FOREACH(qtlib ${QTLIBLIST})
> >             IF (WIN32)
> >               GET_FILENAME_COMPONENT(QT_DLL_PATH_tmp
> > ${QT_QMAKE_EXECUTABLE} PATH)
> >               file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/Debug)
> >               file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/Release)
> >               file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/MinSizeRel)
> >               file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/RelWithDebInfo)
> >               INSTALL(FILES ${QT_DLL_PATH_tmp}/${qtlib}${type}d4.dll
> >                   DESTINATION ./
> >                   CONFIGURATIONS Debug
> >                   COMPONENT Applications)
> >               INSTALL(FILES ${QT_DLL_PATH_tmp}/${qtlib}4.dll
> >                   DESTINATION ./
> >                   CONFIGURATIONS Release
> >                   COMPONENT Applications)
> >               add_custom_target(ZZ_${qtlib}-Debug-Copy ALL
> >                           COMMAND ${CMAKE_COMMAND} -E
> >                                                        copy_if_different
> ${QT_DLL_PATH_tmp}/${qtlib}${TYPE}4.dll
> >                           ${PROJECT_BINARY_DIR}/Debug/
> >                           COMMENT "Copying ${qtlib}${TYPE}4.dll to
> > ${PROJECT_BINARY_DIR}/Debug/")
> >               add_custom_target(ZZ_${qtlib}-Release-Copy ALL
> >                           COMMAND ${CMAKE_COMMAND} -E
> >                                                   copy_if_different
> ${QT_DLL_PATH_tmp}/${qtlib}4.dll
> >                           ${PROJECT_BINARY_DIR}/Release/
> >                           COMMENT "Copying ${qtlib}4.dll to
> > ${PROJECT_BINARY_DIR}/Release/")
> >             ENDIF (WIN32)
> >           ENDFOREACH(qtlib)
> >
> >       endif(MSVC)
> >   endif(DEFINED QT_QMAKE_EXECUTABLE)
> > endif(NOT Q_WS_MAC)
> >
> >
> >>
> >> So, in summary, I think cmake is completely ignoring libexpat, even when
> I
> >> explicitly tell it (in the gui) where the include and library files are.
> >>
> >> Any ideas?
> >>
> > Follow the advice by Stefan. I too believe that is the reason why the
> > include did not work.
> >
> > John
>
> Here is a slightly improved version of the above:
>
>
> # --------------------------------------------------------------------
> # Copy the needed Qt libraries into the Build directory. Also add
> installation
> # and CPack code to support installer generation.
> # --------------------------------------------------------------------
> if ( NOT Q_WS_MAC AND MSVC AND DEFINED QT_QMAKE_EXECUTABLE)
>
>    SET (QTLIBLIST QtCore QtGui)
>    SET (QTPLUGINLIST qgif qjpeg qtiff)
>    set (BUILD_TYPES "Debug;Release")
>
>    foreach (btype ${BUILD_TYPES})
>        string(TOUPPER ${btype} BTYPE)
>        file(MAKE_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${btype})
>        foreach(qtlib ${QTLIBLIST})
>
>            string(TOUPPER ${qtlib} QTLIB)
>           # message(STATUS "QT_${QTLIB}_LIBRARY_${BTYPE}:
> ${QT_${QTLIB}_LIBRARY_${BTYPE}}")
>            GET_FILENAME_COMPONENT(DLL_NAME
> ${QT_${QTLIB}_LIBRARY_${BTYPE}} NAME_WE)
>           # message(STATUS "DLL_NAME: ${DLL_NAME}")
>            GET_FILENAME_COMPONENT(QT_BIN_PATH ${QT_QMAKE_EXECUTABLE} PATH)
>           # message(STATUS "QT_BIN_PATH: ${QT_BIN_PATH}")
>
>            INSTALL(FILES ${QT_BIN_PATH}/${DLL_NAME}.dll
>                DESTINATION ./
>                CONFIGURATIONS ${btype}
>                COMPONENT Applications)
>
>            add_custom_target(Z_${qtlib}-${BTYPE}-Copy ALL
>                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
> ${QT_BIN_PATH}/${DLL_NAME}.dll
>                        ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${btype}/
>                        COMMENT "Copying
> ${QT_BIN_PATH}/${DLL_NAME}.dll to
> ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${btype}/")
>
>        endforeach()
>
>    # For this project we also need to copy the imageformat Qt plugins
> which should have already been defined
>    # in the cmake variables QTPLUGINS_DEBUG, QTPLUGINS_RELEASE and
> QTPLUGINS
>        file(MAKE_DIRECTORY
> ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${btype}/plugins/imageformats)
>        foreach(plugin ${QTPLUGINLIST})
>            string(TOUPPER ${plugin} PLUGIN)
>           # message(STATUS "QT_${QTLIB}_LIBRARY_${BTYPE}:
> ${QT_${QTLIB}_LIBRARY_${BTYPE}}")
>            GET_FILENAME_COMPONENT(DLL_NAME
> ${QT_${PLUGIN}_PLUGIN_${BTYPE}} NAME_WE)
>           # message(STATUS "DLL_NAME: ${DLL_NAME}")
>           # GET_FILENAME_COMPONENT(QT_BIN_PATH ${QT_QMAKE_EXECUTABLE} PATH)
>           # message(STATUS "QT_BIN_PATH: ${QT_BIN_PATH}")
>
>            INSTALL(FILES ${QT_PLUGINS_DIR}/imageformats/${DLL_NAME}.dll
>                DESTINATION ./plugins/imageformats
>                CONFIGURATIONS ${btype}
>                COMPONENT Applications)
>
>            add_custom_target(Z_${plugin}-${BTYPE}-Copy ALL
>                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
> ${QT_PLUGINS_DIR}/imageformats/${DLL_NAME}.dll
>
> ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${btype}/plugins/imageformats/
>                        COMMENT "Copying
> ${QT_PLUGINS_DIR}/imageformats/${DLL_NAME}.dll to
> ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${btype}/plugins/imageformats")
>
>        endforeach(plugin ${QTPLUGINS_${BTYPE}})
>
>                #write a qt.conf file into the application directory and
> install it
>                file(WRITE
> ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${btype}/qt.conf "")
>                INSTALL(FILES
> ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${btype}/qt.conf
>                                DESTINATION .
>                                CONFIGURATIONS ${btype}
>                                COMPONENT Applications )
>
>    endforeach()
> endif()
>
> Mike Jackson
>



-- 
Clark
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20100731/6c1370fa/attachment-0001.htm>


More information about the CMake mailing list