貌似有个CMake教程上说过“不要使用CMake编译Qt”,原因是Qt有自己的QMake,用CMake会费时费力,不过为了能把所有工程采用同样的编译方式,还是尝试了一下,的确很麻烦。
首先需要下载Qt SDK,因为打算用VS2010编译,所以下载了everywhere的4.7b2版本(注意:4.6.3不支持2010,强编会出错,4.7b2静态编译也会有同样的问题,估计正式版会有改善吧)
编译整体还是比较简单的
- 把VS目录下的vcvars32.bat复制到qt目录下
- 打开控制台,首先运行vcvars32.bat
- configure –platform win32-msvc2010
- nmake
- 等待N长时间编译完成,真的非常长时间
- 编译结果6G,保留bin,include,lib目录即可
4.7的编译有个缺点就是所有路径都是完整路径会写死,且不能选择编译结果的输出路径,所以要是打算多次编译一定要确定好目录,否则会很麻烦。
然后写一个简单的CMakeLists.txt文件:
#Project Name
PROJECT(BookStar)SET(QT_FOLDER D:/qt-4.7.0-b2)
# include directories
INCLUDE_DIRECTORIES(inc
${PROJECT_BINARY_DIR}
${QT_FOLDER}/include)# lib directories
LINK_DIRECTORIES(${QT_FOLDER}/lib)# source
SET(SRCS
src/main.cpp
src/mainwindow.cpp
${MOCS}
)# add exe
ADD_EXECUTABLE(BookStar ${SRCS})
TARGET_LINK_LIBRARIES( BookStar QtCore4 QtGui4 )
编译错误,原来Qt在编译时,需要首先使用uic.exe编译UI文件,通过moc.exe处理Q_OBJECT之类的宏,当然你可以去掉这些定义,否则就需要加上:
# COMPILE UIs
SET(UIS
mainwindow
)FOREACH (ui_file ${UIS})
SET(TMP_IN "${PROJECT_SOURCE_DIR}/res/${ui_file}.ui")
SET(TMP_OUT "${PROJECT_BINARY_DIR}/ui_${ui_file}.h")
EXECUTE_PROCESS(COMMAND ${QT_FOLDER}/bin/uic.exe -o ${TMP_OUT} ${TMP_IN})
MESSAGE(STATUS "EXEC=${QT_FOLDER}/bin/uic.exe -o ${PROJECT_BINARY_DIR}/ui_${ui_file}.h ${PROJECT_SOURCE_DIR}/res/${ui_file}.ui")
ENDFOREACH(ui_file)# CREATE MOC
SET(HEADERS
mainwindow
)FOREACH (header_file ${HEADERS})
SET(TMP_IN "${PROJECT_SOURCE_DIR}/inc/${header_file}.h")
SET(TMP_OUT "${PROJECT_BINARY_DIR}/moc_${header_file}.cpp")
EXECUTE_PROCESS(COMMAND ${QT_FOLDER}/bin/moc.exe -o ${TMP_OUT} ${TMP_IN})
SET(MOCS ${MOCS} ${PROJECT_BINARY_DIR}/moc_${header_file}.cpp)
MESSAGE(STATUS "EXEC=${QT_FOLDER}/bin/moc.exe -o ${PROJECT_BINARY_DIR}/moc_${header_file}.cpp ${PROJECT_SOURCE_DIR}/inc/${header_file}.h")
ENDFOREACH(header_file)
这里要注意的是:EXECUTE_PROCESS在COMMAND后面不能加引号,命令直接写,否则执行的程序也不会出错,但也不会正常运行,这个曾让我纠结很久- –
当然为了实现简单,两个列表变量定义时都没有带扩展名,如果希望更清楚一些,则需要通过CMAKE的字符串处理处理一下。
编译是没有问题了,但FindQt4还不能用,不知道是不是编译时没有安装好,每次都找不到Qt的目录,这个还需要继续研究