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

irene w ire866306 at gmail.com
Wed Jun 1 10:01:54 EDT 2016


Thank you very much for your help, Jakob,  I replace file(GLOB) with set()
macro. It works now. I'll look at qt4_wrap_cpp macro and see if I can use
it. In my case, Qt may not be installed on the system with the default
location, it is under the Thirdparty  directory. I am not sure if the
macro can automatically find Qt.

Thanks again,

On Wed, Jun 1, 2016 at 3:02 AM, Jakob van Bethlehem <
jsvanbethlehem at gmail.com> wrote:

> 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.
>
> 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_6851439966933586043_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
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20160601/3d2cf832/attachment-0001.html>


More information about the CMake mailing list