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的目录,这个还需要继续研究

你可能感兴趣的:(我爱开源)