QTCreator+MingW+cmake环境编译nana库


     nana库是CSDN网友jinhao开发的C++ GUI库。大量使用了C++0x以及11的语法特性,而且已经可以在Linux/X11和win平台下跑起来,个人来看还是蛮喜欢。看起来,jinhao很希望把nana推向boost,说不定很有前途呢。尽管nana尚处于开发中,我还是忍不住要玩两下。

     尽管纯属个人兴趣,编程的时候我还是喜欢有个顺手的IDE。眼下能够横跨Linux和windows的开源IDE也不算少,Codelite,code blcoks ,和QT都不错。jinhao随库提供了code blocks的工程文件。但是相比较之下,我现在觉得QTCreator最近发展的不错,更加顺手,而且对cmake的支持相当不错。此文就以QTCreato+cmake环境,记录一下编译nana库的简单步骤吧。

     公司电脑没有linux环境,性能只适合于办公使用,安装虚拟机跑linux相当费劲,所以俺还是选择mingw环境来测试。

     值得一提的是,nana本身分成了C++11和03两个分支,我这边使用的是11分支,按说并不需要boost库支持。但是在使用mingw构建的时候,由于跨平台移植的缘故,涉及到线程相关的部分,貌似还是需要引入boost的线程库。不过mingw/GCC进化到4.8.1以后,已经可以原生支持std::thread、mutex....了。不过你需要直接从codeplex的仓库里直接下载最新版的nana源码,并且做一点小小的hack(注释一行算hack么:))。

    由于开源软件日新月异,这里我只是简单说明下环境, QT Creator采用的是2.8.0,cmake 2.8.10,mingw/GCC 4.8.1 (Thread model: posix)这些工具请自行下载并配置。

nana 下载地址:http://nanapro.codeplex.com/,记得使用Download打包的最新源码。

QTCreator+MingW+cmake环境编译nana库_第1张图片

下载之后,将nana的C++11分支解压到硬盘,下面我们开始工作。由于QTCreator支持cmake工程,所以我们先行编写一个适用于nana库编译的cmakelists.txt文件,并将其置于nana源码的根目录之下。

CMakeLists.txt(大小写敏感的哈,不对的话QTCreator就不睬你了) 代码如下:

project(nana)
cmake_minimum_required(VERSION 2.8)

INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

FILE(GLOB_RECURSE ALL_SRC "source/*.cpp")
SET (SRC_LIST "")

FOREACH(src ${ALL_SRC})
  IF(NOT(src MATCHES ".*linux_X11.*"))
    LIST(APPEND SRC_LIST ${src})
  ENDIF(NOT(src MATCHES ".*linux_X11.*"))
ENDFOREACH(src)

#FOREACH(item ${SRC_LIST})
#  message(${item})
#ENDFOREACH(item)

ADD_DEFINITIONS(-std=c++11)

ADD_LIBRARY(${PROJECT_NAME} STATIC ${SRC_LIST})

简要说明几点:

    1、由于是个人使用,眼下又在windows平台下编译,需要剔除linux X11的相关代码。当切换到linux平台的时候你懂的 需要将两处".*linux_X11.*"替换成 ".*win32.*"

    2、cmake默认需要在源码的各级子目录下分别放一个CMakeLists.txt ,偏偏jinhao采用的源码目录结构子目录蛮多的,到处都是这玩意的话,既繁琐也不科学。为此,采用了cmake 2.8之后的新特性,遍历源码子目录取得cpp列表并剔除平台相关的部分源文件即可。

   此外,为了方便寻找编译好的nana库,指定lib输出目录在源码根目录下的/lib下。

接下来你可以打开QTCreator,并选择打开此cmakelists.txt,然后IDE会提示你初次配置,唯一需要说明的是,cmake可以采用外部编译的方式,以减少对源码目录结构的污染,QTCreator也会提示你cmake的相关配置文件的目录。我选择在nana库源码根目录下的build目录下新建一个cmake目录作为build文件的存身之处。然后执行cmake就完成工程配置了。

在正式build之前,需要对nana源码做个小改动,打开include/nana子目录下的config.hpp文件,注释掉一行:

 
  
	#if defined(__MINGW32__)
		#define NANA_MINGW
		#define STD_CODECVT_NOT_SUPPORTED
        //#define STD_THREAD_NOT_SUPPORTED //就这行....gcc 4.8.1已经可以原生支持thread特性了
	#endif

接下来不出意外的话,您就可以在/lib目录下得到libnana.a了。

 为了顺利编译nana的两个demo,我还如法炮制,顺手写了个CMakeLists.txt,同样放置到demo的目录下用QTCreator打开即可。

project(nanademo)
cmake_minimum_required(VERSION 2.8)
SET(NANA_DIR D:/CL/nana)
INCLUDE_DIRECTORIES(${NANA_DIR}/include)
LINK_DIRECTORIES(${NANA_DIR}/lib)
LINK_LIBRARIES(nana)
ADD_DEFINITIONS(-std=c++11)
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static -mwindows")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/target)
add_executable(nanacal calculator.cpp)
add_executable(nanademo widget_show/demo.cpp11.cpp)

    这个也可以作为日后,使用nana库的简单模版,记得将NANA_DIR 设置为你的nana库所在的文件夹。另外,
CMAKE_EXE_LINKER_FLAGS所指定的link选项这里采用的是静态链接,并使用-mwindows项去除了令人讨厌的命令行窗口,这在linux下面是不需要的。
最后,感谢jinhao在现代C++ GUI库上所做的尝试,也希望有更多的人支持国货:)


你可能感兴趣的:(MinGW,C/C++)