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 < [email protected]> 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 <[email protected]> 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 <[email protected]> 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 >> > >
-- 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
