CMake快速入门

参考: https://www.hahack.com/codes/cmake/

1. 单目标文件

main.c

#include <stdio.h>     
#include <stdlib.h>    



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;
}

int main(int argc, char *argv[])
{
    if (argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }

    double base = atof(argv[1]);
    int exponent = atoi(argv[2]);
    double result = power(base, exponent);
    printf("%g ^ %d is %g\n", base, exponent, result);
    
    return 0;
}

CMakeLists.txt

cmake_minimum_required (VERSION 2.8)   # 指定最低的版本号

# 项目信息
project (Demo01_cmake)

# 指定生成目标
add_executable(Demo_exe main.c)       # Demo_exe为生成的可执行文件 main.c为依赖文件

然后 

cmake .    # 生成makeFile文件
make # 执行make

2. 同一个目录,多个源文件

calc_power.h

double power(double a, int b);

calc_power.c

#include "calc_power.h"

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;                                                                          
}

main.cpp

#include <stdio.h>                                           
#include <stdlib.h>                                          
#include "calc_power.h"                                      
                                                             
int main(int argc, char *argv[])                             
{                                                            
    if (argc < 3){                                           
        printf("Usage: %s base exponent \n", argv[0]);       
        return 1;                                            
    }                                                        
                                                             
    double base = atof(argv[1]);                             
    int exponent = atoi(argv[2]);                            
    double result = power(base, exponent);                   
    printf("%g ^ %d is %g\n", base, exponent, result);       
                                                             
    return 0;                                                
}                                                            

CMakeLists.txt

cmake_minimum_required (VERSION 2.8)

# 项目信息
project (Demo2_cmake)

# 指定生成目标
# add_executable(Demo2_cmake main.c calc_power.c)  # 如果源文件多,这样写麻烦

# 该命令会查找指定目录下的所有源文件, 然后将结果存到指定变量名
# 如下: 查找当前目录下的所有源文件, 并将名称报错到 DIR_SRCS 变量 
aux_source_directory(. DIR_SRCS)

# 指定生成目标
# CMake 会将当前目录所有源文件名赋值给变量 DIR_SRCS
# 再指示变量 DIR_SRCS 中源文件 编译成一个 Demo2_exe的可执行文件
add_executable(Demo2_exe ${DIR_SRCS})

再执行

cmake .
make

 3. 多目录,多文件

main.c

#include <stdio.h>                                          
#include <stdlib.h>                                         
#include "./mymath/calc_power.h"                            
                                                            
int main(int argc, char *argv[])                            
{                                                           
    if (argc < 3){                                          
        printf("Usage: %s base exponent \n", argv[0]);      
        return 1;                                           
    }                                                       
                                                            
    double base = atof(argv[1]);                            
    int exponent = atoi(argv[2]);                           
    double result = power(base, exponent);                  
    printf("%g ^ %d is %g\n", base, exponent, result);      
                                                            
    return 0;                                               
}                                                           
                                                            

mymath的目录下CMakeLists.txt

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)

# 生成链接库
# 使用add_library 将src目录中的源文件编译成静态链接库
add_library(calc_power $(DIR_LIB_SRCS))

main.c所在的目录下的CMakeLists.txt

# Make 最低版本号要求                                                      
cmake_minimum_required (VERSION 2.8)                                       
                                                                           
# 项目信息                                                                 
project (Demo3_cmake)                                                      
                                                                           
# 查找当前目录下的所有源文件                                               
# 并将名称保存到 DIR_SRCS 变量                                             
aux_source_directory(. DIR_SRCS)                                           
                                                                           
# 添加 math 子目录, 这样mymath目录下的 CMakeLists.txt文件和源代码也会被处理
add_subdirectory(mymath)                                                   
                                                                           
# 指定生成目标                                                             
add_executable(Demo3_exe main.c)                                           
                                                                           
# 添加链接库, 指明可执行文件Demo3_exe 需要连接一个名为 calc_power的链接库  
target_link_libraries(Demo3_exe calc_power)                                
                                                                           

然后:

cmake .
make

 

posted @ 2019-04-24 11:02  douzujun  阅读(715)  评论(0编辑  收藏  举报