因为近来需要把一些 Linux 项目转到 Windows 上来开发, 所以有了一些跨平台开发的笔记, 此篇讲CMake, 供以后查阅.
CMake介绍
你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。
就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。
显然,
CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等。
CMake一些有用的网站
将build和项目源文件分离的方法
假设项目A的根目录下有一个 CMakeLists, 在项目的根目录新建一个叫 build 的文件夹, 然后进入 build 文件夹内, 执行命令 cmake ..
即可.
CMakeLists实例讲解
比如有一个目录结构如下的项目 :
├─RealTimeServer
├─RealTimeServer
│ ├─CMakeFiles.txt
│ ├─a.h
│ ├─a.cpp
│ ├─b.h
│ ├─b.cpp
│ ├─TestFolder
│ │ ├─a.h
│ │ ├─a.cpp
│ │ ├─b.h
│ │ ├─b.cpp
│ └─...
├─Tool
这是一个比较通用的CMakeLists.txt :
1 |
|
对于像上面这样一个CMake的CMakeLists来说, 需要着重解释的有以下几点 :
add_definitions(-std=c++11)
这句是为了解决 linux 默认不支持 c++11 的问题set_target_properties(${PROJ_NAME} PROPERTIES LINK_FLAGS "/SUBSYSTEM:WINDOWS") # works for all build modes
这句是为了解决WinMain的问题, 否则在vs平台会报main非法引用的问题. 这句会影响到vs的 “项目属性-链接器-系统-子系统”target_link_libraries(${PROJ_NAME} wsock32 ws2_32)
这句是为了在vs下链接ws2_32库, windows需要链接这个库才能用socket. 这句会影响到vs的 “项目属性-链接器-输入-附加依赖项”file(GLOB_RECURSE CURRENT_HEADERS *.h *.hpp) source_group("Include" FILES ${CURRENT_HEADERS})
这句是为了解决在vs下不显示头文件的问题set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w")
-w
的意思是关闭编译时的警告,也就是编译后不显示任何warning,因为有时在编译之后编译器会显示一些例如数据转换之类的警告,这些警告是我们平时可以忽略的。-Wall
选项意思是编译后显示所有警告。-W
选项类似-Wall,会显示警告,但是只显示编译器认为会出现错误的警告。
在编译一些项目的时候可以-W和-Wall选项一起使用。这里可以查看gcc的各种警告级别.