写qt程序的时候经常要将item封装成lib,这样.h和.cpp就不在一个文件夹下,经常会遇到编译问题。
以下是我生产lib的cmake文件。
add_definitions(-DBOOST_NO_MEMBER_TEMPLATE_FRIENDS -DWIN32)
find_package(Qt4 REQUIRED)
include(${QT_USE_FILE})
INCLUDE_DIRECTORIES( ${QT_INCLUDE_DIR} )
#qwt
INCLUDE_DIRECTORIES("D:/lib/qwt-6.1.2/src")
link_directories("D:/lib/qwt-6.1.2/lib")
SET(KPS_FLIRT_GUI_MOC_SRCS
${${PROJECT_NAME}_SOURCE_DIR}/sdk/include/a.h
}
set(KPS_FLIRT_GUI_SRCS
a.cpp
)
set(KPS_FLIRT_GUI_UIS
#ADD UIS FILE HERE ##
)
set(KPS_FLIRT_GUI_QCCS
#ADD .qrc FILE HERE###
)
SET(DEBUG_PFX "")
IF(CMAKE_BUILD_TYPE MATCHES "release")
ELSE(release)
SET(DEBUG_PFX "${DEBUG_PFX}d")
ENDIF(release)
SET(LINUX_LIB "")
if(WIN32)
else(WIN32)
SET(LINUX_LIB
"${LINUX_LIB}
rt"
)
endif(WIN32)
set(KPS_FLIRT_GUI_LIBS
${LINUX_LIB}
${Boost_LIBRARIES}
)
qt4_automoc(${KPS_FLIRT_GUI_SRCS})
QT4_WRAP_CPP(KPS_FLIRT_GUI_MOC ${KPS_FLIRT_GUI_MOC_SRCS})
QT4_WRAP_UI(KPS_FLIRT_GUI_UIS_H ${KPS_FLIRT_GUI_UIS})
QT4_ADD_RESOURCES(KPS_FLIRT_GUI_QCCS_SRCS ${KPS_FLIRT_GUI_QCCS})
ADD_DEFINITIONS(-D_REENTRANT -DQT_NO_DEBUG -DQT_SQL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED )
SET(LIB_NAME "libflirtgui${DEBUG_PFX}")
add_library(${LIB_NAME} ${KPS_FLIRT_GUI_SRCS} ${KPS_FLIRT_GUI_MOC} ${KPS_FLIRT_GUI_UIS_H} ${KPS_FLIRT_GUI_QCCS_SRCS} )
target_link_libraries(${LIB_NAME} ${KPS_FLIRT_GUI_LIBS})
其中:qt4_automoc(${KPS_FLIRT_GUI_SRCS})是自动生成.cxx文件
常见错误:
1、编译找不到头文件,这时候注意头文件目录是否正确,不光cpp要修改,同时要触发cmake的编译,只有改对路径不行。
2、item与boost编译冲突,使用Q_MOC_RUN隔离错误
#ifndef Q_MOC_RUN
#include <boost/math/special_functions/bessel.hpp>
#endif
顺便遇到了opengl在vs2010下的错误,error C2146: 语法错误: 缺少“;”(在标识符“******”的前面),傻的不行的头文件包含顺序。#include <windows.h>一定要放在第一个,第一个,第一个,没有之一!!!!
#if defined(_WINDOWS)
#include <windows.h>
#endif
#ifndef Q_MOC_RUN
#include <GL/gl.h>
#include <GL/glu.h>
#endif