Cmake使用心得
2016-07-21 22:27
405 查看
Welcome to my personal blog:
www.freehacker.cn
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。
CMake的所有的语句都写在一个叫:CMakeLists.txt 的文件中。当CMakeLists.txt文件确定后,可以用ccmake命令对相关 的变量值进行配置。这个命令必须指向CMakeLists.txt所在的目录。配置完成之后,应用cmake命令生成相应的makefile(在Unix like系统下)或者 project文件(指定用window下的相应编程工具编译时)。需要为任何子目录建立一个CMakeLists.txt。
其基本操作流程为:
其中,directory为CMakeLists.txt所在目录,Makefile等文件的生成目录为cmake执行目录:
第一条语句用于配置编译选项,如VTK_DIR目录,一般这一步不需要配置,直接执行第二条语句即可,但当出现错误时,这里就需要认为配置了,这一步才真正派上用场;
第二条命令用于根据CMakeLists.txt生成Makefile文件;
三条命令用于执行Makefile文件,编译程序,生成可执行文件。
注:为了方便描述,下面的文件目录按照以下规则:
EXECUTABLE_OUTPUT_PATH表示最终的目标二进制的位置;
LIBRARY_OUTPUT_PATH表示最终的共享库。
在哪里ADD_EXECUTABLE或ADD_LIBRARY,如果需要改变目标存放路径,就在哪里加入上述的定义。
PROJECT_SOURCE_DIR为工程所在目录;PROJECT_BINARY_DIR为编译发生的当前目录,也就是make的执行目录。
用来定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言。
这个指令隐式的定义了两个cmake变量:<projectname>_BINARY_DIR以及<projectname>_SOURCE_DIR。cmake系统也帮助我们预定义了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR变量,他们的值分别跟 <projectname>_BINARY_DIR与 <projectname>_SOURCE_DIR 一致。建议使用PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR。
用于向终端输出用户定义的信息,包含三种类型:
SEND_ERROR,产生错误,生成过程被跳过。
SATUS,输出前缀为—的信息。
FATAL_ERROR,立即终止所有 cmake 过程.。
定义了这个工程会生成一个名为demo的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表。
SHARED:动态库
STATIC:静态库
MODULE:在使用dyld的系统有效,如果不支持dyld,则被当做SHARED对待
EXCLUDE_FROM_ALL 参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。
用来设置输出的名称,对于动态库,还可以用来指定动态库版本和 API 版本。
可执行二进制myrun安装到${CMAKE_INSTALL_PREFIX}/bin目录
动态库libmylib安装到${CMAKE_INSTALL_PREFIX}/lib目录
静态库libmystaticlib安装到${CMAKE_INSTALL_PREFIX}/libstatic目录
运行下面的代码,会先创建一个./debug目录,然后拷贝file.dll到./debug目录。
www.freehacker.cn
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。
CMake 使用方法
CMake的所有的语句都写在一个叫:CMakeLists.txt 的文件中。当CMakeLists.txt文件确定后,可以用ccmake命令对相关 的变量值进行配置。这个命令必须指向CMakeLists.txt所在的目录。配置完成之后,应用cmake命令生成相应的makefile(在Unix like系统下)或者 project文件(指定用window下的相应编程工具编译时)。需要为任何子目录建立一个CMakeLists.txt。其基本操作流程为:
ccmake directory cmake directory cmake -DCMAKE_BUILD_TYPE=Debug/Release directory make
其中,directory为CMakeLists.txt所在目录,Makefile等文件的生成目录为cmake执行目录:
第一条语句用于配置编译选项,如VTK_DIR目录,一般这一步不需要配置,直接执行第二条语句即可,但当出现错误时,这里就需要认为配置了,这一步才真正派上用场;
第二条命令用于根据CMakeLists.txt生成Makefile文件;
三条命令用于执行Makefile文件,编译程序,生成可执行文件。
注:为了方便描述,下面的文件目录按照以下规则:
工程顶层目录:/cmake in source编译下:工程编译发生目录为/cmake out of source编译下:工程编译目录为/cmake/build 源文件所在目录为:/cmake/src 二进制文件目录:/cmake/build/bin
Cmake目录规则
|----build/builds | |----cmake | |----mingw32 | |----msvc | |----redhat | |----valgrind | |----zos |----common |----config |----debug |----doc |----include |----release |----src |----tests |----tools |----utils |--- AUTHORS |--- autogen.bat/sh |--- CMakeLists.txt |--- COPYING |--- INSTALL |--- MAINTAINERS |--- NEWS |--- README.md
CMake常用变量和环境变量
工程顶层目录/cmake
CMAKE_SOURCE_DIR PROJECT_SOURCE_DIR <projectname>_SOURCE_DIR // 以下环境变量在in source编译情况下为工程顶层目录 CMAKE_BINARY_DIR PROJECT_BINARY_DIR <projectname>_BINARY_DIR
工程构建目录/cmake/build
//out of source编译情况下 CMAKE_BINARY_DIR PROJECT_BINARY_DIR <projectname>_BINARY_DIR
与当前Cmake或二进制相关
CMAKE_CURRENT_SOURCE_DIR //当前处理的 CMakeLists.txt 所在的路径。例如源文件所在目录/cmake/src //如果是in source编译,就是工程顶层目录/cmake //如果是out of source编译,就是target编译目录(/cmake/build/bin),可以使用ADD_SUBDIRECTORY(src bin)来更改这个值。 CMAKE_CURRRENT_BINARY_DIR
输出相关
EXECUTABLE_OUTPUT_PATH SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) LIBRARY_OUTPUT_PATH SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
EXECUTABLE_OUTPUT_PATH表示最终的目标二进制的位置;
LIBRARY_OUTPUT_PATH表示最终的共享库。
在哪里ADD_EXECUTABLE或ADD_LIBRARY,如果需要改变目标存放路径,就在哪里加入上述的定义。
PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR
PROJECT_SOURCE_DIR为工程所在目录;PROJECT_BINARY_DIR为编译发生的当前目录,也就是make的执行目录。
CMake指令
CMAKE_MINIMUM_REQUIRED
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
option指令
PROJECT指令
PROJECT(projectname [CXX] [C] [Java]) 示例:PROJECT (HELLO CXX)
用来定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言。
这个指令隐式的定义了两个cmake变量:<projectname>_BINARY_DIR以及<projectname>_SOURCE_DIR。cmake系统也帮助我们预定义了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR变量,他们的值分别跟 <projectname>_BINARY_DIR与 <projectname>_SOURCE_DIR 一致。建议使用PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR。
SET指令
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) 示例:SET(SRC_LIST main.cpp t1.cpp t2.cpp)
MESSAGE指令
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...) 示例:MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
用于向终端输出用户定义的信息,包含三种类型:
SEND_ERROR,产生错误,生成过程被跳过。
SATUS,输出前缀为—的信息。
FATAL_ERROR,立即终止所有 cmake 过程.。
ADD_EXECUTABLE指令
ADD_EXECUTABLE(demo ${SRC_LIST}) ADD_EXECUTABLE(demo main.cpp t1.cpp t2.cpp)
定义了这个工程会生成一个名为demo的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表。
ADD_LIBRARY指令
ADD_LIBRARY(libname [SHARED|STATIC|MODULE][EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
SHARED:动态库
STATIC:静态库
MODULE:在使用dyld的系统有效,如果不支持dyld,则被当做SHARED对待
EXCLUDE_FROM_ALL 参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。
SET_TARGET_PROPERTIES指令
SET_TARGET_PROPERTIES(target1 target2 ...PROPERTIES prop1 value1prop2 value2 ...)
用来设置输出的名称,对于动态库,还可以用来指定动态库版本和 API 版本。
INSTALL指令
INSTALL(TARGETS myrun mylib mystaticlib RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION libstatic )
可执行二进制myrun安装到${CMAKE_INSTALL_PREFIX}/bin目录
动态库libmylib安装到${CMAKE_INSTALL_PREFIX}/lib目录
静态库libmystaticlib安装到${CMAKE_INSTALL_PREFIX}/libstatic目录
CMake使用
自定义Makefile目标
运行下面的代码,会先创建一个./debug目录,然后拷贝file.dll到./debug目录。add_custom_command( OUTPUT ./debug/file.dll COMMAND mkdir -p ./debug cp ./file.dll ./debug DEPENDS ./file.dll ) add_custom_target(dlltest DEPENDS ./debug/file.dll) add_executable(demo ${SRC_LIST}) add_dependencies(demo dlltest )
相关文章推荐
- 指针与数组
- 【codeforces】Tricky Sum
- 正则表达式
- html5 progress
- 第十二讲:存储虚拟化(二)
- Spring MVC 和 Spring 总结
- 输出 Java 数组最简单的方式
- Android的一些细节概念
- deepin安装Curl的方法
- 2016.07.09【初中部 NOIP提高组 】模拟赛C
- 机房合作验收总结
- JVM配置参数解析
- JVM配置参数解析
- Qt5位置相关函数
- hdu 5744 Keep On Movin
- 创业18
- 设计模式之单例模式
- SpringMvc与Struts2的对比
- 2016 Multi-University Training Contest 2 1009 It's All In The Mind
- Tomcat 启动闪退 找不到类 java/lang/Object