• sbs cmake


    最基本的Hello World

    目录结构

    laolang@laolang-PC:~/code/clion/cmakestudy$ ll
    总用量 8
    -rw-r--r-- 1 laolang laolang 154 1月  23 03:43 CMakeLists.txt
    -rw-r--r-- 1 laolang laolang  79 1月  23 03:42 main.c
    laolang@laolang-PC:~/code/clion/cmakestudy$ 

    CMakeLists.txt

    # cmake 支持的最小版本
    cmake_minimum_required(VERSION 3.7)

    # 项目名称与语言
    project(cmakestudy C)

    # 设置语言版本
    set(CMAKE_C_STANDARD 99)

    # 设置源文件列表
    set(SOURCE_FILES main.c)

    # 可执行程序
    add_executable(cmakestudy ${SOURCE_FILES})

    构建过程

    laolang@laolang-PC:~/code/clion/cmakestudy$ cmake .
    -- The C compiler identification is GNU 6.4.0
    -- Check for working C compiler: /usr/bin/cc
    -- Check for working C compiler: /usr/bin/cc -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Detecting C compile features
    -- Detecting C compile features - done
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/laolang/code/clion/cmakestudy
    laolang@laolang-PC:~/code/clion/cmakestudy$ ll
    总用量 36
    -rw-r--r-- 1 laolang laolang 10609 1月  23 03:47 CMakeCache.txt
    drwxr-xr-x 5 laolang laolang  4096 1月  23 03:47 CMakeFiles
    -rw-r--r-- 1 laolang laolang  1381 1月  23 03:47 cmake_install.cmake
    -rw-r--r-- 1 laolang laolang   272 1月  23 03:47 CMakeLists.txt
    -rw-r--r-- 1 laolang laolang    79 1月  23 03:42 main.c
    -rw-r--r-- 1 laolang laolang  4805 1月  23 03:47 Makefile
    laolang@laolang-PC:~/code/clion/cmakestudy$ make
    Scanning dependencies of target cmakestudy
    [ 50%] Building C object CMakeFiles/cmakestudy.dir/main.c.o
    [100%] Linking C executable cmakestudy
    [100%] Built target cmakestudy
    laolang@laolang-PC:~/code/clion/cmakestudy$ ll
    总用量 48
    -rw-r--r-- 1 laolang laolang 10609 1月  23 03:47 CMakeCache.txt
    drwxr-xr-x 5 laolang laolang  4096 1月  23 03:47 CMakeFiles
    -rw-r--r-- 1 laolang laolang  1381 1月  23 03:47 cmake_install.cmake
    -rw-r--r-- 1 laolang laolang   272 1月  23 03:47 CMakeLists.txt
    -rwxr-xr-x 1 laolang laolang  8632 1月  23 03:47 cmakestudy
    -rw-r--r-- 1 laolang laolang    79 1月  23 03:42 main.c
    -rw-r--r-- 1 laolang laolang  4805 1月  23 03:47 Makefile
    laolang@laolang-PC:~/code/clion/cmakestudy$ ./cmakestudy 
    Hello, World!
    laolang@laolang-PC:~/code/clion/cmakestudy$ 

    注意事项

    没有 make clean。因为CMakeLists.txt可以执行脚本并通过脚本生成一些临时文件,所以没有办法跟踪这些临时文件到底是哪些。因此没有办法提供一个可靠的 make disclean 方案

    指令大小写无关,参数和变量大小写相关

    基本的外部构建

    目录结构

    laolang@laolang-PC:~/code/clion/cmakestudy$ tree
    .
    ├── build
    ├── CMakeLists.txt
    └── main.c
    
    1 directory, 2 files
    laolang@laolang-PC:~/code/clion/cmakestudy$ 

    CMakeLists.txt

    
    cmake_minimum_required(VERSION 3.7)
    
    
    project(cmakestudy C)
    
    set(CMAKE_C_STANDARD 99)
    
    # message 用法
    # SEND_ERROR 产生错误,生成过程被跳过
    # STATUS 输出前缀哦 -- 的信息
    # FATAL_ERROR 立即终止所有 cmake 过程
    # 源码文件路径
    message(STATUS "源码路径:" ${PROJECT_SOURCE_DIR})
    # 二进制文件路径
    message(STATUS "二进制文件路径" ${PROJECT_BINARY_DIR})
    
    # 设置源文件列表的另一种方法
    aux_source_directory(. SRC_LIST)
    
    
    add_executable(cmakestudy ${SRC_LIST})

    注意事项

    添加源文件的两种方法:

    例如在clion中,添加源文件其实就是把所有的源文件的名字加到一个SOURCE_LIST的变量中

    可以使用aux_source_directory来设置一个目录中的所有源文件

    构建过程

    laolang@laolang-PC:~/code/clion/cmakestudy$ ll
    总用量 12
    drwxr-xr-x 2 laolang laolang 4096 1月  23 04:00 build
    -rw-r--r-- 1 laolang laolang  609 1月  23 04:02 CMakeLists.txt
    -rw-r--r-- 1 laolang laolang   73 1月  23 03:59 main.c
    laolang@laolang-PC:~/code/clion/cmakestudy$ cd build/
    laolang@laolang-PC:~/code/clion/cmakestudy/build$ cmake ..
    -- The C compiler identification is GNU 6.4.0
    -- Check for working C compiler: /usr/bin/cc
    -- Check for working C compiler: /usr/bin/cc -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Detecting C compile features
    -- Detecting C compile features - done
    -- 源码路径:/home/laolang/code/clion/cmakestudy
    -- 二进制文件路径/home/laolang/code/clion/cmakestudy/build
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/laolang/code/clion/cmakestudy/build
    laolang@laolang-PC:~/code/clion/cmakestudy/build$ make
    Scanning dependencies of target cmakestudy
    [ 50%] Building C object CMakeFiles/cmakestudy.dir/main.c.o
    [100%] Linking C executable cmakestudy
    [100%] Built target cmakestudy
    laolang@laolang-PC:~/code/clion/cmakestudy/build$ ./cmakestudy 
    Hello, World!
    laolang@laolang-PC:~/code/clion/cmakestudy/build$ 

    添加子目录

    目录结构

    laolang@laolang-PC:~/code/clion/cmakestudy$ tree
    .
    ├── build
    ├── CMakeLists.txt
    └── src
        ├── CMakeLists.txt
        └── main.c
    
    2 directories, 3 files
    laolang@laolang-PC:~/code/clion/cmakestudy$ 

    顶层CMakeLists.txt

    # cmake 支持的最小版本
    cmake_minimum_required(VERSION 3.7)
    
    # 项目名称与语言
    project(cmakestudy C)
    
    # 设置语言版本
    set(CMAKE_C_STANDARD 99)
    
    # 添加子目录
    # add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
    # source_dir 源码目录
    # binary_dir 二进制目录
    # EXCLUDE_FROM_ALL 将这个目录从编译过程中排除
    add_subdirectory(src)

    src/CMakeLists.txt

    aux_source_directory(. SRC_LIST)
    
    # 改变二进制生成目录
    set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    
    add_executable(cmakestudy ${SRC_LIST})

    构建

    laolang@laolang-PC:~/code/clion/cmakestudy$ cd build/
    laolang@laolang-PC:~/code/clion/cmakestudy/build$ ll
    总用量 0
    laolang@laolang-PC:~/code/clion/cmakestudy/build$ cmake ..
    -- The C compiler identification is GNU 6.4.0
    -- Check for working C compiler: /usr/bin/cc
    -- Check for working C compiler: /usr/bin/cc -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Detecting C compile features
    -- Detecting C compile features - done
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/laolang/code/clion/cmakestudy/build
    laolang@laolang-PC:~/code/clion/cmakestudy/build$ make
    Scanning dependencies of target cmakestudy
    [ 50%] Building C object src/CMakeFiles/cmakestudy.dir/main.c.o
    [100%] Linking C executable ../bin/cmakestudy
    [100%] Built target cmakestudy
    laolang@laolang-PC:~/code/clion/cmakestudy/build$ ./bin/cmakestudy 
    Hello, World!
    laolang@laolang-PC:~/code/clion/cmakestudy/build$ 

    注意事项

    如果不指定二进制目录,则在构建的时候会把二进制文件与中间文件全部生成在build/src中

    同时生成静态库与动态库

    目录结构

    laolang@laolang-PC:~/code/clion/cmakestudy$ tree
    .
    ├── build
    ├── CMakeLists.txt
    ├── include
    │   └── sum.h
    ├── Makefile
    └── src
        ├── CMakeLists.txt
        ├── main
        │   ├── CMakeLists.txt
        │   └── main.c
        └── sum
            ├── CMakeLists.txt
            └── sum.c
    
    5 directories, 8 files
    laolang@laolang-PC:~/code/clion/cmakestudy$ 

    顶层CMakeLists.txt

    # cmake 支持的最小版本
    cmake_minimum_required(VERSION 3.7)
    
    # 项目名称与语言
    project(cmakestudy C)
    
    # 设置语言版本
    set(CMAKE_C_STANDARD 99)
    
    # 添加子目录
    # add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
    # source_dir 源码目录
    # binary_dir 二进制目录
    # EXCLUDE_FROM_ALL 将这个目录从编译过程中排除
    add_subdirectory(src)

    src/CMakeLists.txt

    add_subdirectory(main)
    add_subdirectory(sum)

    src/main/CMakeLists.txt

    aux_source_directory(. SRC_LIST)
    
    # 头文件目录
    include_directories(${PROJECT_SOURCE_DIR}/include)
    
    # 改变二进制生成目录
    set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    
    add_executable(cmakestudy ${SRC_LIST})
    
    # 库文件目录
    link_directories(${PROJECT_BINARY_DIR}/lib)
    
    # 要链接的库文件
    target_link_libraries(cmakestudy
      sum
      )

    src/main/main.c

    #include <stdio.h>
    #include"../../include/sum.h"
    int main() {
        printf("Hello, World!
    ");
        printf("%d
    ",sum(1,2));
        return 0;
    }

    src/sum/CMakeLists.txt

    aux_source_directory(. SRC_LIST)
    
    # 头文件目录
    include_directories(${PROJECT_SOURCE_DIR}/include)
    
    # 库文件生成目录
    set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
    
    # 动态库
    add_library(sum SHARED ${SRC_LIST})
    
    # 静态库
    add_library(sum_static STATIC ${SRC_LIST})
    
    
    # 静态库的输出名称
    set_target_properties(sum_static PROPERTIES OUTPUT_NAME "sum")
    
    # 动态库与静态库同事存在
    set_target_properties(sum PROPERTIES CLEAN_DIRECT_OUTPUT 1)
    set_target_properties(sum_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
    
    # 指定动态库版本
    set_target_properties(sum PROPERTIES VERSION 1.0 SOVERSION 1)

    src/sum/sum.c

    #include"../../include/sum.h"
    
    int sum( int a, int b ){
        return a + b;
    }

    include/sum.h

    #ifndef INCLUDE_SUM_H
    #define INCLUDE_SUM_H
    
    int sum( int a, int b );
    
    #endif /* INCLUDE_SUM_H */

    Makefile

    all:run
    
    # 运行
    run:build
        ./build/bin/cmakestudy
    
    # 构建
    build:init
        cd build && cmake .. && make
    # 重新构建
    rebuild:clean build
    
    # 删除build目录
    clean:
        rm -rf build
    # 创建 build 目录
    init:
        if [ ! -d build ]; then mkdir build; fi

    一键运行

    laolang@laolang-PC:~/code/clion/cmakestudy$ make
    if [ ! -d build ]; then mkdir build; fi
    cd build && cmake .. && make
    -- The C compiler identification is GNU 6.4.0
    -- Check for working C compiler: /usr/bin/cc
    -- Check for working C compiler: /usr/bin/cc -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Detecting C compile features
    -- Detecting C compile features - done
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/laolang/code/clion/cmakestudy/build
    make[1]: Entering directory '/home/laolang/code/clion/cmakestudy/build'
    make[2]: Entering directory '/home/laolang/code/clion/cmakestudy/build'
    make[3]: Entering directory '/home/laolang/code/clion/cmakestudy/build'
    Scanning dependencies of target sum
    make[3]: Leaving directory '/home/laolang/code/clion/cmakestudy/build'
    make[3]: Entering directory '/home/laolang/code/clion/cmakestudy/build'
    [ 16%] Building C object src/sum/CMakeFiles/sum.dir/sum.c.o
    [ 33%] Linking C shared library ../../lib/libsum.so
    make[3]: Leaving directory '/home/laolang/code/clion/cmakestudy/build'
    [ 33%] Built target sum
    make[3]: Entering directory '/home/laolang/code/clion/cmakestudy/build'
    Scanning dependencies of target cmakestudy
    make[3]: Leaving directory '/home/laolang/code/clion/cmakestudy/build'
    make[3]: Entering directory '/home/laolang/code/clion/cmakestudy/build'
    [ 50%] Building C object src/main/CMakeFiles/cmakestudy.dir/main.c.o
    [ 66%] Linking C executable ../../bin/cmakestudy
    make[3]: Leaving directory '/home/laolang/code/clion/cmakestudy/build'
    [ 66%] Built target cmakestudy
    make[3]: Entering directory '/home/laolang/code/clion/cmakestudy/build'
    Scanning dependencies of target sum_static
    make[3]: Leaving directory '/home/laolang/code/clion/cmakestudy/build'
    make[3]: Entering directory '/home/laolang/code/clion/cmakestudy/build'
    [ 83%] Building C object src/sum/CMakeFiles/sum_static.dir/sum.c.o
    [100%] Linking C static library ../../lib/libsum.a
    make[3]: Leaving directory '/home/laolang/code/clion/cmakestudy/build'
    [100%] Built target sum_static
    make[2]: Leaving directory '/home/laolang/code/clion/cmakestudy/build'
    make[1]: Leaving directory '/home/laolang/code/clion/cmakestudy/build'
    ./build/bin/cmakestudy
    Hello, World!
    3
    laolang@laolang-PC:~/code/clion/cmakestudy$ 

    TODO

    cygwin不能同事生成

    默认链接静态库

    引用方式不对,正常来说应该是把库文件和头文件安装到本地,然后链接安装好的头文件和库文件

    khl
  • 相关阅读:
    hdu 5116 计数
    hdu 5117 数学公式展开 + dp
    hdu 5115 Dire Wolf 区间dp
    I00025 寻找循环数
    外部设备发展趋势
    外部设备发展趋势
    互联网
    互联网
    I00024 出钱买羽
    I00024 出钱买羽
  • 原文地址:https://www.cnblogs.com/khlbat/p/8333789.html
Copyright © 2020-2023  润新知