跨平台CMake的编写
2015-12-22 08:04
603 查看
最近开发跨平台C++编译器,让我深切的体会到了CMake的重要性,一开始,项目只有简短的配置,所有的依赖项都需要手动下载并编译。
但不同人下载和编译的方式许多,版本也不同,编译器也不同,Debug版本也不同,稍有不慎就无法链接到一起。
例如我们开发的Elite编译器,就依赖许多第三方库,像lua、oolua、libiconv、LLVM等,这些库都需要配置方可使用,如果不自动配置的化,让每一位开发者手动配置,那么就十分容易出问题。
我们这里介绍一下CMake控制安装库的方式,首先介绍安装CMake管理的项目,这个是最简单的。
ExternalProject是一个非常棒的Cmake工具,能够从Git上下载指定仓库到某一个路径下,我们只需要配置好仓库地址、下载目标目录,源代码目录,并且指定:
即可,Cmake会自动执行下载、配置、编译、安装这几个步骤
例如:Unix可以判断是否为unix系列,包括linux、苹果、cygwin等
Win32可以判断是否为windows平台
这些预定义变量可以帮助我们轻松编写不同平台的执行动作,例如oolua是在不同平台下,是用不同的脚本配置编译的:
但不同人下载和编译的方式许多,版本也不同,编译器也不同,Debug版本也不同,稍有不慎就无法链接到一起。
C++链接库的问题
由于C++库没有通用的ABI,底层链接接口都是各编译器制定的,所以不同编译器编译的库不能混合使用,于是,为了保险起见,我们将全部依赖项都使用编译安装的方式,用同一款编译器编译,选用合适的配置,这样才能保障链接不出问题。例如我们开发的Elite编译器,就依赖许多第三方库,像lua、oolua、libiconv、LLVM等,这些库都需要配置方可使用,如果不自动配置的化,让每一位开发者手动配置,那么就十分容易出问题。
跨平台CMake的技巧
CMake是一款非常强大的工具,我觉得它最大的亮点就是良好的跨平台性能。我们这里介绍一下CMake控制安装库的方式,首先介绍安装CMake管理的项目,这个是最简单的。
ExternalProject_Add(liblua DOWNLOAD_DIR third_party/ GIT_REPOSITORY https://github.com/elite-lang/lua SOURCE_DIR third_party/lua/ CMAKE_COMMAND cmake CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${third_party_install_path}" # INSTALL_COMMAND "" BUILD_ALWAYS 0 )
ExternalProject是一个非常棒的Cmake工具,能够从Git上下载指定仓库到某一个路径下,我们只需要配置好仓库地址、下载目标目录,源代码目录,并且指定:
CMAKE_COMMAND cmake
即可,Cmake会自动执行下载、配置、编译、安装这几个步骤
判断目标平台
CMAKE下,已经帮我们预制好了许多变量,通过判断这些变量的值,即可确定目标平台例如:Unix可以判断是否为unix系列,包括linux、苹果、cygwin等
Win32可以判断是否为windows平台
这些预定义变量可以帮助我们轻松编写不同平台的执行动作,例如oolua是在不同平台下,是用不同的脚本配置编译的:
## oolua的构建 if (APPLE) set(OOLUA_BUILD_COMMAND make "mac") elseif (UNIX) set(OOLUA_BUILD_COMMAND make "linux") elseif (MSVC) if(MSVC12) set(OOLUA_BUILD_COMMAND "vs2013x86_build.bat") elseif(MSVC14) set(OOLUA_BUILD_COMMAND "vs2015x86_build.bat") endif() endif() ExternalProject_Add(liboolua DEPENDS liblua DOWNLOAD_DIR third_party/ GIT_REPOSITORY https://github.com/elite-lang/oolua SOURCE_DIR third_party/oolua/ CONFIGURE_COMMAND "" BUILD_COMMAND ${OOLUA_BUILD_COMMAND} BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/third_party/oolua/build_scripts/" INSTALL_COMMAND "" INSTALL_DIR ${third_party_install_path} )
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- RPC failed; result=22, HTTP code = 411
- git更新已經刪除的文件
- 关于指针的一些事情
- 提取Git每次提交后Commit的文件
- GIT迁移服务器
- 分布式版本管理git入门指南使用资料汇总及文章推荐
- c++ primer 第五版 笔记前言
- git终极指南:在实际开发中的应用
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结