[CMake] CMake+QT always failed for the first build, and succeeded for second build or later.

Hendrik Sattler post at hendrik-sattler.de
Wed Jun 1 04:47:24 EDT 2016



Am 1. Juni 2016 09:26:18 MESZ, schrieb Jakob van Bethlehem <jsvanbethlehem at gmail.com>:
>That is what he said, but it seems to be a typo, because the
>CMakeLists.txt
>file clearly states 'set(QT_DIR
>${CMAKE_CURRENT_SOURCE_DIR}/ThirdParty/Qt/4.8.6)'

Ok, I overlooked that one...

>- still a stone-age version of Qt actually :(

Hey, that was the LTS release until 1 or 2 month ago!
And they made Qt 5.6 an LTS release also to quieten people that complain about dropping modules without proper replacement (means feature parity) and dropping compiler support.
You will see users of Qt 5.6 for a loooooong time.

>On Wed, Jun 1, 2016 at 9:09 AM, Hendrik Sattler
><post at hendrik-sattler.de>
>wrote:
>
>>
>>
>> Am 1. Juni 2016 09:02:41 MESZ, schrieb Jakob van Bethlehem <
>> jsvanbethlehem at gmail.com>:
>> >Hej,
>> >
>> >Some things that come to mind:
>> >* You're generating files *inside* the source tree - you're not
>> >supposed to
>> >do that
>> >* Why do you want to have a special Qt_tmp directory? I don't see
>the
>> >benefit, and without that requirement you can simply use the
>> >qt4_wrap_cpp
>> >macro explicitly and you still are not forced to use the automoc
>> >feature
>> >
>> >And now for what is probably wrong in your CMakeLists.txt:
>> >* It seems you made an important mistake regarding the behaviour of
>> >'file(GLOB)'. That function will do the expansion *while running
>> >CMake*.
>> >But at that time the moc_* files *don't exist!* (as a matter of
>fact,
>> >the
>> >tmp directory doesn't even exist). In other words, your
>${Moc_SOURCES}
>> >will
>> >be empty, and hence they are not compiled, and hence you get
>precisely
>> >the
>> >linker errors you see (because these sources implement the functions
>> >that
>> >are listed as missing by the linker)
>> >
>> >If you would use the qt4_wrap_cpp() macro you don't run into this
>> >problem,
>> >so I'd strongly suggest using it.
>>
>> Except that he is using Qt3.
>>
>> >Sincerely,
>> >Jakob van Bethlehem
>> >
>> >
>> >
>> >
>> >On Tue, May 31, 2016 at 4:52 PM, irene w <ire866306 at gmail.com>
>wrote:
>> >
>> >> It seems CMakw could not find the generated moc_xxx files.  I
>> >modified the
>> >> scripts to specify moc_xxx files is generated, but it still has
>same
>> >errors.
>> >>
>> >> ADD_CUSTOM_COMMAND ( OUTPUT ${Qt_tmp}/moc_GMWindow.cpp
>> >>                      COMMAND ${QT_MOC_CMD} ${GM_DIR}/GMWindow.h -o
>> >> ${Qt_tmp}/moc_GMWindow.cpp
>> >>                      DEPENDS ${GM_DIR}/GMWindow.h
>> >>                    )
>> >> ADD_CUSTOM_TARGET(generate_foo DEPENDS ${Qt_tmp}/moc_GMWindow.cpp)
>> >> SET_SOURCE_FILES_PROPERTIES(${Qt_tmp}/moc_GMWindow.cpp PROPERTIES
>> >> GENERATED 1)
>> >> SET_PROPERTY(SOURCE ${GM_DIR}/GMWindow.cpp APPEND PROPERTY
>> >OBJECT_DEPENDS
>> >> ${Qt_tmp}/moc_GMWindow.cpp)
>> >>
>> >> .....
>> >> add_dependencies (GM generate_foo)
>> >>
>> >>
>> >> Does the Macro  "SET_SOURCE_FILES_PROPERTIES" with "GENERATED"
>> >> setting work for this purposes?  Any help would be greatly
>> >appreciated !
>> >>
>> >>
>> >> On Wed, May 25, 2016 at 12:48 PM, irene w <ire866306 at gmail.com>
>> >wrote:
>> >>
>> >>> Hi,
>> >>>
>> >>> I am compiling a simple Qt3 application on Linux using CMake. In
>my
>> >case,
>> >>> I need to build moc_xxx files with custom options and output to a
>> >specified
>> >>> directory, So, I was not using CAMKE_AUTO macros. My cmake
>scripts
>> >create a
>> >>> "Qt_tmp" directory and output moc_xxx there.
>> >>>
>> >>> It looked it always failed to link the moc_xxx files for the
>first
>> >time
>> >>> build when there is no "Qt_tmp" directory, and succeeded if I ran
>> >build
>> >>> again if the "Qt_tmp" directory and moc_xxx files created by the
>> >failed
>> >>> build were kept without removing.  However, it'll fail if I
>delete
>> >>> the "Qt_tmp" directory.
>> >>>
>> >>> Even it failed at the first build, the moc_xxx files were
>> >>> successfully created in the "Qt_tmp" directory.
>> >>>
>> >>> Here is my cmake scripts and the errors I got.  Can anyone help
>me
>> >to
>> >>> figure out the issues? Any help would be greatly appreciated.
>> >Thanks.
>> >>>
>> >>> CMakeLists.txt
>> >>>
>> >>>
>>
>>
>>---------------------------------------------------------------------------------------------
>> >>> cmake_minimum_required(VERSION 3.4.1)
>> >>> project (GM_Application CXX)
>> >>> SET (CMAKE_SYSTEM_NAME Linux)
>> >>> SET (CMAKE_CXX_COMPILER ${COMPILER_PATH}${CROSS_COMPILE}g++)
>> >>> set (GM_DIR ${CMAKE_CURRENT_SOURCE_DIR})
>> >>> set (QT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ThirdParty/Qt/4.8.6)
>> >>> LINK_DIRECTORIES (${QT_DIR}/lib)
>> >>> INCLUDE_DIRECTORIES ("${QT_DIR}/include"
>> >>>                      "${GM_DIR}"
>> >>> )
>> >>> ##### Compiling QT moc and ui  #####
>> >>> set (QT_MOC_CMD ${QT_DIR}/bin/moc -I$(QT_DIR)/mkspecs/linux-g++
>> >>> -I${QT_DIR}/include -I${QT_DIR}/include/QtGui)
>> >>> file (MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Qt_tmp)
>> >>> set (Qt_tmp ${CMAKE_CURRENT_SOURCE_DIR}/Qt_tmp)
>> >>> add_custom_target (Moc_GMWindows
>> >>>                    COMMAND ${QT_MOC_CMD} ${GM_DIR}/GMWindow.h -o
>> >>> ${Qt_tmp}/moc_GMWindow.cpp
>> >>>                   )
>> >>>
>> >>> ##### Compiling application  #####
>> >>> file (GLOB GM_SOURCES ${GM_DIR}/*.h ${GM_DIR}/*.cpp)
>> >>> file (GLOB Moc_SOURCES ${Qt_tmp}/*.h ${Qt_tmp}/*.cpp)
>> >>> add_executable (GM ${GM_SOURCES} ${Moc_SOURCES})
>> >>> target_include_directories (GM PRIVATE ${Qt_tmp})
>> >>> add_dependencies (GM Moc_GMWindows)
>> >>> target_link_libraries (GM QtGui)
>> >>>
>> >>>
>> >>>
>>
>>
>>-------------------------------------------------------------------------------------------
>> >>> Errors:
>> >>>
>> >>> Scanning dependencies of target Moc_GMWindows
>> >>> [  0%] Built target Moc_GMWindows
>> >>> Scanning dependencies of target GM
>> >>> [ 14%] Building CXX object GM/CMakeFiles/GM.dir/GM/GM.cpp.o
>> >>> [ 42%] Building CXX object
>GM/CMakeFiles/GM.dir/GM/GMService.cpp.o
>> >>> [ 67%] Building CXX object GM/CMakeFiles/GM.dir/GM/GMWindow.cpp.o
>> >>> [ 85%] Building CXX object GM/CMakeFiles/GM.dir/GM/main.cpp.o
>> >>> [100%] Linking CXX executable ../bin/GM
>> >>> CMakeFiles/GM.dir/GM/GMWindow.cpp.o: In function
>> >>> `GM::GMWindow::emitAppendMessage(QStrin
>> >>> g)':
>> >>> /GM/GMWindow.cpp:217: undefined reference to
>> >>> `GM::GMWindow::appendMessage(QString)'
>> >>>
>>
>>CMakeFiles/GM.dir/GM/GMWindow.cpp.o:(.rodata._ZTVN2GM8GMWindowE[vtable
>> >>> for GM::GMWindow]
>> >>> +0x8): undefined reference to `GM::GMWindow::metaObject() const'
>> >>>
>>
>>CMakeFiles/GM.dir/GM/GMWindow.cpp.o:(.rodata._ZTVN2GM8GMWindowE[vtable
>> >>> for GM::GMWindow]
>> >>> +0xc): undefined reference to `GM::GMWindow::qt_metacast(char
>> >const*)'
>> >>>
>>
>>CMakeFiles/GM.dir/GM/GMWindow.cpp.o:(.rodata._ZTVN2GM8GMWindowE[vtable
>> >>> for GM::GMWindow]
>> >>> +0x10): undefined reference to
>> >>> `GM::GMWindow::qt_metacall(QMetaObject::Call, int, void**)'
>> >>> collect2: ld returned 1 exit status
>> >>> make[2]: *** [bin/GM] Error 1
>> >>> make[1]: *** [GM/CMakeFiles/GM.dir/all] Error 2
>> >>> make: *** [all] Error 2
>> >>>
>> >>>
>> >>>
>> >>>
>> ><
>>
>https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail
>> >
>> >Virus-free.
>> >>> www.avast.com
>> >>>
>> ><
>>
>https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail
>> >
>> >>>
>>
>>
>><#m_3542150497808946122_m_6400203814648417669_DDB4FAA8-2DD7-40BB-A1B8-4E2AA1F9FDF2>
>> >>>
>> >>
>> >>
>> >> --
>> >>
>> >> Powered by www.kitware.com
>> >>
>> >> Please keep messages on-topic and check the CMake FAQ at:
>> >> http://www.cmake.org/Wiki/CMake_FAQ
>> >>
>> >> Kitware offers various services to support the CMake community.
>For
>> >more
>> >> information on each offering, please visit:
>> >>
>> >> CMake Support: http://cmake.org/cmake/help/support.html
>> >> CMake Consulting: http://cmake.org/cmake/help/consulting.html
>> >> CMake Training Courses: http://cmake.org/cmake/help/training.html
>> >>
>> >> Visit other Kitware open-source projects at
>> >> http://www.kitware.com/opensource/opensource.html
>> >>
>> >> Follow this link to subscribe/unsubscribe:
>> >> http://public.kitware.com/mailman/listinfo/cmake
>> >>
>> >
>> >
>>
>>------------------------------------------------------------------------
>>
>> --
>> Diese Nachricht wurde von meinem Android-Mobiltelefon mit K-9 Mail
>> gesendet.
>> --
>>
>> Powered by www.kitware.com
>>
>> Please keep messages on-topic and check the CMake FAQ at:
>> http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Kitware offers various services to support the CMake community. For
>more
>> information on each offering, please visit:
>>
>> CMake Support: http://cmake.org/cmake/help/support.html
>> CMake Consulting: http://cmake.org/cmake/help/consulting.html
>> CMake Training Courses: http://cmake.org/cmake/help/training.html
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Follow this link to subscribe/unsubscribe:
>> http://public.kitware.com/mailman/listinfo/cmake
>>
>
>
>------------------------------------------------------------------------

-- 
Diese Nachricht wurde von meinem Android-Mobiltelefon mit K-9 Mail gesendet.


More information about the CMake mailing list