经过三天的尝试,摸索,终于把项目从vs和qt creator中转到了cmake 和eclipse,中间几次都想放弃了。
在windows下用Visual Studio开发肯定是最方便的,但是程序用户的电脑装的xp系统(吐槽一下,几百号人的设计院,清一色的xp+集成显卡,17寸显示屏),只能支持到vs2008,自己写的程序有些是在vs2012中用C++0x写的,2008编译不能通过,只能选用Mingw平台。Qt Creator没有对python脚本的支持,也不太方便。因此选择了Cmake+Eclipse。满足了下边几个要求:
(1)out of source build
(2) 使用c++编写程序和共享库,使用python编写脚本进行文件管理和MS word的操作。
(3) 更换平台之后,代码不用改,也不必安装eclipse(配置eclipse实在太麻烦了),直接cmake,make就能构建程序。
整体思路:写cmakelists
->创建一个空的eclipse项目,参见参考[1]
->添加target,参见参考[2]
->添加到src和executable文件夹的link。
google上关于具体步骤的文章已经比较多了,这里说下自己这两天遇到的问题。
(1)eclipse能够正常编译,但是代码编辑器中不能跳转头文件,很多错误:
原因:eclipse代码编辑器中代码分析和编译器的代码分析是相对独立的,由于使用了no toolchain,不会自动导入C_INCLUDE_PATH,CPLUS_INCLUDE_PATH中的文件进行头文件跳转分析。
解决方案:很多人提供的方法是将头文件添加到paths and symbols 中。MinGW和Qt加起来有十来个目录,弄起来比较麻烦,也容易出错。我是在创建项目时选择cross gcc toolchain,这样会自动将C_INCLUDE_PATH和CPLUS_INCLUDE_PATH中的头文件添加到搜索目录中,比较省事。
(2)gdb无法运行,错误代码:unknown target exception XXX
原因:环境变量设置有问题,见参考[3]
感觉这个有点看脸了,开始弄了两天没弄好,差点就换Qt Creator了,最后莫名奇妙的就能用了:)
参考下最后成功时候的bat,如果还不行也没办法了:
1 set PATH=D:\develop\Qt\5.1.0\5.1.0\mingw48_32\bin;d:\develop\Qt\5.1.0\Tools\mingw48_32\bin;%PATH%
2 set CPLUS_INCLUDE_PATH=%CPLUS_INCLUDE_PATH%;D:\develop\Qt\5.1.0\5.1.0\mingw48_32\include
3 set CPLUS_INCLUDE_PATH=%CPLUS_INCLUDE_PATH%;D:\develop\Qt\5.1.0\5.1.0\mingw48_32\include\QtCore
4 set CPLUS_INCLUDE_PATH=%CPLUS_INCLUDE_PATH%;D:\develop\Qt\5.1.0\5.1.0\mingw48_32\include\QtGui
5 set CPLUS_INCLUDE_PATH=%CPLUS_INCLUDE_PATH%;D:\develop\Qt\5.1.0\5.1.0\mingw48_32\include\QtWidgets
6 set CPLUS_INCLUDE_PATH=%CPLUS_INCLUDE_PATH%;D:\develop\Qt\5.1.0\5.1.0\mingw48_32\include\QtOpenGL
7 set C_INCLUDE_PATH=%C_INCLUDE_PATH%;D:\develop\Qt\5.1.0\5.1.0\mingw48_32\include
8 set C_INCLUDE_PATH=%C_INCLUDE_PATH%;D:\develop\Qt\5.1.0\5.1.0\mingw48_32\include\QtCore
9 set C_INCLUDE_PATH=%C_INCLUDE_PATH%;D:\develop\Qt\5.1.0\5.1.0\mingw48_32\include\QtGui
10 set C_INCLUDE_PATH=%C_INCLUDE_PATH%;D:\develop\Qt\5.1.0\5.1.0\mingw48_32\include\QtWidgets
11 set C_INCLUDE_PATH=%C_INCLUDE_PATH%;D:\develop\Qt\5.1.0\5.1.0\mingw48_32\include\QtOpenGL
12 set LIBRARY_PATH=%LIBRARY_PATH%;D:\develop\Qt\5.1.0\5.1.0\mingw48_32\lib
13 REM set PATH=%PATH%;%LIBRARY_PATH%;D:\develop\Qt\5.1.0\Tools\QtCreator\bin
有人说把lib也加到path里边,后来注释掉了gdb也能运行
(3) gdb 提示warning:eclipse Internal error: pc 0x0 in read in psymtab, but not in symtab.
原因:和共享库symbol的加载有关
解决方案:debug Configurations -> Debugger-> 选项卡Shared Libraries : uncheck ”Load shared library symbols automatically“
(4) no rules to make target "all"
原因:一般是因为找不到makefile
解决方案:检查build directory ,如果是点的小锤子检查build command,如果是make target检查target的命令
(5)qt程序中显示console窗口
方法:在cmakelists中添加下边的语句:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mconsole")
如果不想要console
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mwindows")
(6)eclipse中不能索引std::shared_ptr,std::array,等
原因:使用的c++98标准库
解决方案:在paths and symbols中将symbol __cplusplus改为201103L
(7)Qt中使用openGL
if(QT_WITH_OPENGL)
find_package(OPENGL REQUIRED)
find_package(QT5OpenGL REQUIRED)
message(STATUS "\twith QT opengl")
message(STATUS "opengl libs : ${OPENGL_LIBRARY}")
qt5_use_modules(${MODULE_NAME} OpenGL)
target_link_libraries(${MODULE_NAME} ${OPENGL_LIBRARY})
endif()
[1]CMake:Eclipse UNIX Tutorial
http://www.vtk.org/Wiki/CMake:Eclipse_UNIX_Tutorial
[2]全方位打造 Eclipse 自定义开发环境
http://www.cnblogs.com/dabaopku/archive/2012/02/11/2346802.html
[3]集成QtCreator与Eclipse CDT,及相关问题的解决
http://blog.csdn.net/dyw/article/details/3863064