要在不同平台上构建不同的工程需要使用到构建工具,很多开源项目都是用的makefile,但是这东西并不怎么适合国人的习惯,我喜欢双击工程文件自动打开xcode或者vs2013.然后再开发工具里面写代码。编译,链接,单步调试等。所以我不打算用makefile,而是用cmake 来构建。
这里简单描述一下cmake 是干什么的。cmake 是一个工具,一个可执行程序。 他需要一个名字为"CMakeLists.txt" 文件来配合。就和make 工具需要makefile 文件一样。假如下载了一个开源代码,如果发现目录下有 "CMakeLists.txt" 文件,那就爽了。可以直接生成vs工程或者xcode工程。我这里说一下我的设计。
1) 一个总的CMakeLists.txt。 这个文件用来定义所有的工程。可以想象成这是一个解决方案。解决方案里面会包含很多的子工程。
#XPhone_Plus 解决方案的名称
project(XPhone_Plus)
#需要的cmake 版本号
cmake_minimum_required(VERSION 2.8)
#cmake 的路径
SET (CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/build/CMakeModules/;${CMAKE_MODULE_PATH}")
#子工程生成的一些路径。比如lib 文件生成在哪个目录。bin 生成的目录等
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/../lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/../lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/../bin)
# 这个包含了一些全局设置,比如说工程要生成的编译选项,要生成哪几种的工程等。globalsetting 是一个自己写的文件,但是里面#的内容基本通用。
INCLUDE (globalsetting)
#下面就是这个解决方案的子工程了
add_subdirectory(src/Common)
add_subdirectory(src/XPhonePlus)
add_subdirectory(src/Test)
2) 每个工程一个CMakeLists.txt。
工程中有目录结构,还有需要编译的文件列表,以及宏定义等等,这些就需要每个工程自己来定义了,所以一个工程里面放一个CMakeLists.txt 还是比较合理的。
#cryptopp工程名
project (cryptopp)
#根据不同的平台定义一些宏定义
if (WIN32)
#-DUSE_PRECOMPILED_HEADERS 说明一下:-D 是一个前缀,真正的宏定义是后面 USE_PRECOMPILED_HEADERS
ADD_DEFINITIONS(-DUSE_PRECOMPILED_HEADERS)
if (CMAKE_X64)
ADD_DEFINITIONS(-DCRYPTOPP_DISABLE_ASM)
endif(CMAKE_X64)
elseif(APPLE)
#多个宏定义之间用空格隔开,比如下面USE_PRECOMPILED_HEADERSCRYPTOPP_DISABLE_ASM 隔开了
ADD_DEFINITIONS(-DUSE_PRECOMPILED_HEADERS -DCRYPTOPP_DISABLE_ASM)
endif (WIN32)
INCLUDE_DIRECTORIES (${COMMON_INCLUDE} . ..)
#下面就是文件列表了
FILE (GLOB header_files *.h)
FILE (GLOB source_files *.c *.cpp)
#ADD_LIBRARY表示生成一个静态库。 ADD_EXECUTABLE 表示生成一个exe 文件
ADD_LIBRARY (cryptopp ${header_files} ${source_files})
所以使用cmake 来构建是非常方便的。无论是mac osx 还是windows 都很方便
第一步算是完成了。