CMake
参考链接:http://www.hahack.com/codes/cmake/
一、CMake简介
CMake是一种跨平台编译工具,CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))
二、编译步骤
编译过程:
cmake/ccmake PATH # PATH为CMakeLists.txt 所在的目录,.代表当前目录,..代表上一级目录
#ccmake与cmake的区别就是ccmake供了一个交互式的界面。
make
make install #将 make 生成的文件安装到系统的对应目录中
参数:
cmake -D **=** PATH
make -j4 #指同时运行命令的个数。如果-j后没有参数,make运行命令时能运行多少就运行多少。如果 #有一个以上的“-j”参数,那么仅最后一个“-j”才是有效的
三、CMake指令
cmake_minimum_required (VERSION *) # CMake 最低版本号要求
project (*) #指定项目的名称,一般和项目的文件夹名称对应
INCLUDE_DIRECTORIES(*) #头文件目录
aux_source_directory(* *) #查找目录下的所有源文件,并将名称保存到 * 变量
add_executable(* ${*}) #指定生成目标
target_link_libraries(* ${*}) #加载链接库
configure_file(* *)#加入一个配置头文件,用于处理 CMake 对源码的设置
option(* "*" ON/OFF) #添加选项
add_subdirectory(*)#添加子目录
add_library(* ${}) #生成链接库
四、实例
文件目录结构:
.
├── build
├── CMakeLists.txt
├── include
│ └── b.h
└── src
├── b.c
└── main.c
Demo1:
main.cpp:
#include "my.h"
int main()
{
double base = 5;
int exponent = 4;
double result = power(base, exponent);
printf("%g ^ %d is %g\n", base, exponent, result);
return 0;
}
my.h:
#include <stdio.h>
#include <stdlib.h>
double power(double base, int exponent);
my.cpp:
double power(double base, int exponent)
{
int result = base;
int i;
if (exponent == 0) {
return 1;
}
for(i = 1; i < exponent; ++i){
result = result * base;
}
return result;
}
CMakeLists.txt :
cmake_minimum_required (VERSION 2.8)
project(Demo1) #项目的名称
add_subdirectory(math) #添加子目录
INCLUDE_DIRECTORIES(include) #添加头文件目录
aux_source_directory(src aa) #把src目录下的源文件保存在aa中
add_executable(Demo ${aa}) #编译aa,生成Demo可执行文件
target_link_libraries(Demo my) #为Demo添加链接库
链接库(CMakeLists.txt) :
cmake_minimum_required (VERSION 2.8)
aux_source_directory(. aa)#把当前目录下的源文件保存在aa中
add_library(my ${aa}) #生成链接库
Demo2:
main.cpp:
#include "my.h"
int main()
{
double base = 5;
int exponent = 4;
double result = power(base, exponent);
printf("%g ^ %d is %g\n", base, exponent, result);
return 0;
}
my.h:
#include <stdio.h>
#include <stdlib.h>
double power(double base, int exponent);
my.cpp:
double power(double base, int exponent)
{
int result = base;
int i;
if (exponent == 0) {
return 1;
}
for(i = 1; i < exponent; ++i){
result = result * base;
}
return result;
}
my.cpp:
double power(double base, int exponent)
{
return base + exponent;
}
#cmakedefine USE_MYMATH #定义变量USE_MYMATH
CMakeLists.txt :
cmake_minimum_required (VERSION 2.8)
project (Demo2)
configure_file (config.h.in build/config.h) #加入一个配置头文件,用于处理 CMake 对源码的设置
option (USE_MYMATH "Use provided math implementation" ON) #定义选项,默认为ON
INCLUDE_DIRECTORIES( include )
if (USE_MYMATH) #使用函数1
add_subdirectory (math_1) #添加子目录
else() #使用函数2
add_subdirectory (math_2) #添加子目录
endif (USE_MYMATH)
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
ADD_EXECUTABLE(Demo ${DIR_SRCS})
target_link_libraries (Demo my)
五、应用
安装gflags:
unzip gflags-master.zip
cd gflags-master
mkdir build
cd build
cmake -D CMAKE_INSTALL_PREFIX=/home/jzn/local_install ..
make -j
make install