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
原文地址:https://www.cnblogs.com/khlbat/p/8333789.html