2019独角兽企业重金招聘Python工程师标准>>>
Cmake能做什么
CMake 是个跨平台的自动化建构系统,它用组态档控制建构过程的方式和 Unix 的 Make 相似,
是 CMake 的组态档取名为 CmakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准
的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一
般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的
软件,CMake 可以编译源代码、制作程式库、产生适配器(wrapper)、还可以用任意的顺序建
构执行档。CMake 支援 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建
构(二进档在别的目录里)
Cmake 基本使用
cmake_minimum_required(VERSION 2.6)
project(hello)
# 添加头文件路径
include_directories(include/)
# 查找src目录下的源文件并添加到 SRC变量中
aux_source_directory(src SRC)
# 指定编译后的程序名称,和相关代码文件
add_executable(hello main.cpp ${SRC})
# 指定安装规则,默认安装到/usr/local 目录下
install(TARGETS hello RUNTIME DESTINATION bin)
文件结构
.
├── build
├── CMakeLists.txt
├── include
├── main.cpp
└── src
注: build 目录不是必须的,主要是因为Cmake生成Makefile时会产生一下临时文件,所以使用了(out-of-place),这样方便管理文件,建议使用(out-of-place)方式,除非你不介意工程目录中多临时文件。
编译时 进入build目录,执行命令(下同)
cmake .. && make
Cmake添加静态库模块
根目录下的 CmakeLists.txt
project(hello)
# 添加头文件路径
include_directories(include/ lib/)
# 添加模块
add_subdirectory(lib)
# 查找src目录下的源文件并添加到 SRC变量中
aux_source_directory(src SRC)
# 设置链接
link_libraries(sub)
# 指定编译后的程序名称,和相关代码文件
add_executable(hello main.cpp ${SRC})
# 指定安装规则,默认安装到/usr/local 目录下
install(TARGETS hello RUNTIME DESTINATION bin)
lib模块下的CmakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(sub)
# SHARED表示生产动态库,STATIC表示生成静态库,默认生成静态库
add_library(sub SHARED sub.cpp)
文件结构
├── build
├── CMakeLists.txt
├── include
│ └── add.h
├── lib
│ ├── CMakeLists.txt
│ ├── sub.cpp
│ └── sub.h
├── main.cpp
└── src
└── add.cpp
进行交叉编译
cmake_minimum_required(VERSION 2.8)
project(hello)
if(${CROSS_COMPILE})
set(CMAKE_C_COMPILER arm-linux-gcc)
set(CMAKE_CXX_COMPILER arm-linux-g++)
endif()
# 添加头文件路径
include_directories(include/ lib/)
# 添加模块
add_subdirectory(lib)
# 查找src目录下的源文件并添加到 SRC变量中
aux_source_directory(src SRC)
# 设置链接
link_libraries(sub)
# 指定编译后的程序名称,和相关代码文件
add_executable(hello main.cpp ${SRC})
# 指定安装规则,默认安装到/usr/local 目录下
install(TARGETS hello RUNTIME DESTINATION bin)
进入build目录,执行
cmake .. -DCROSS_COMPILE=true
即可生成支持arm-linux编译器的Makefile文件
注: 想要重新生成不带交叉编译的版本,只需删除build下的
CmakeCache.txt
,或者 将true 改为false即可
在2.6的版本中Cmake 的if
命令不支持true和false,改为1和0即可
最后,相关工程以防止到 码云上了 https://git.oschina.net/hivebc/cmake_hello
工欲善其事必先利其器 不能只做一个码农,多了解其背后原理更为重要。