CMake編譯Qt

貌似有個CMake教程上說過“不要使用CMake編譯Qt”,原因是Qt有自己的QMake,用CMake會費時費力,不過爲了能把所有工程採用同樣的編譯方式,還是嘗試了一下,的確很麻煩。

首先需要下載Qt SDK,因爲打算用VS2010編譯,所以下載了everywhere的4.7b2版本(注意:4.6.3不支持2010,強編會出錯,4.7b2靜態編譯也會有同樣的問題,估計正式版會有改善吧)

編譯整體還是比較簡單的

  1. 把VS目錄下的vcvars32.bat複製到qt目錄下
  2. 打開控制檯,首先運行vcvars32.bat
  3. configure –platform win32-msvc2010
  4. nmake
  5. 等待N長時間編譯完成,真的非常長時間
  6. 編譯結果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的目錄,這個還需要繼續研究

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章