貌似有個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的目錄,這個還需要繼續研究