CMake实战学习笔记

GNU 编译链接工具链

Liunx-gcc tool_chain(工具链)

  1. 预处理
    生成<.i>文件,通过选项-E可以使编译器在预处理结束时停止编译
  • 例如:gcc -E -o hello.i hello.c
  1. 编译
    生成<.s>汇编代码文件,通过选项-S可以使gcc在进行编译后停止
  • 例如:gcc -S -o hello.s hello.c
  1. 汇编
    生成<.o>的目标文件,是机器语言代码《二进制》,当一个程序由多个代码文件 构成时,每个文件都要先完成汇编工作,生成.o目标文件后,才能进行链接,可以通过选项-C生成目标文件
  • 例如:gcc -C -o hello.o helllo.c
  1. 链接
    将程序的所有机器代码的目标文件链接,使操作系统能加载为可执行文件
  • 例如:gcc -o hello hello.c
  • 或者:gcc hello.c -o hello

Makefile 构建编译链接

makefile 概述

make 命令执行时,需要一个 makefile 文件,以告诉 make 命令需要怎么样的去编译和链接程序。

  • 如果这个工程没有编译过,那么所有c文件都要编译并被链接。
  • 如果这个工程的某几个c文件被修改,那么只编译被修改的c文件,并链接目标程序。
  • 如果这个工程的头文件被改变了,那么需要编译引用了这几个头文件的c文件,并链接目标程序。
  • 只要 makefile 写得够好,所有的这一切,只用一个 make 命令就可以完成,make 命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自动编译所需要的文件和链接目标程序。

CMake 构建编译链接

基本概述请移步 《CMake笔记》文章

Demos

单目录单文件

# 0、项目工程结构
mkdir project_name
cd project_name
touch Main.cpp CMakeLists.txt
vim Main.cpp
vim CMakeLists.txt

# 1、编写 CMakeLists.txt 文件
# CMake 要求最低版本
CMAKE_MINIMUM_REQUIRED (VERSION 3.5)

# 项目工程名称以及工程支持的语言
PROJECT (project_name [CXX][C][JAVA])

# 生成可执行文件
ADD_EXECUTABLE (executable_name Main.cpp)

# 2、使用 cmake 命令生成 Makefile 文件
cmake .

# 3、使用 make 命令
make

单目录多文件

# 0、项目工程结构
mkdir project_name
cd project_name
touch Main.cpp Fuction.cpp
vim Main.cpp
touch CMakeLists.txt 
vim CMakeLists.txt

# 1、编写 CMakeLists.txt 文件
# CMake 要求最低版本
CMAKE_MINIMUM_REQUIRED (VERSION 3.5)

# 项目工程名称以及工程支持的语言
PROJECT (project_name [CXX][C][JAVA])

# 自动搜索路径下所有的源文件赋值给变量
AUX_SOURCE_DIRECTORY (./ src_dir)

# 生成可执行文件
ADD_EXECUTABLE (executable_name ${src_dir})

# 2、使用 cmake 命令生成 Makefile 文件
cmake .

# 3、使用 make 命令
make

多目录多文件

# 0、项目工程结构
mkdir project_name
cd project_name
touch Main.cpp CMakeLists.txt
vim Main.cpp
vim CMakeLists.txt
cd ..
mkdir lib
cd lib 
touch CMakeLists.txt Function.cpp Function.hpp 
vim CMakeLists.txt Function.cpp Function.hpp

# 1、编写 lib 文件夹下的 CMakeLists.txt 文件
# 自动搜索路径下所有的源文件赋值给变量
AUX_SOURCE_DIRECTORY (. src_dir)

# 添加静态库 STATIC 动态库 SHARE
ADD_LIBRARY (Function STATIC ${src_dir})

# 2、编写 project_name 文件夹下的 CMakeLists.txt 文件
# CMake 要求最低版本
CMAKE_MINIMUM_REQUIRED (VERSION 3.5)

# 项目工程名称以及工程支持的语言
PROJECT (project_name [CXX][C][JAVA])

# 添加工程目录的依赖的源文件的子目录
ADD_SUBDIRECTORY (./lib)

# 自动搜索路径下所有的源文件赋值给变量
AUX_SOURCE_DIRECTORY (./ src_dir)

# 生成可执行文件
ADD_EXECUTABLE (executable_name ${src_dir})

# 链接静态库文件 Function
TARGET_LINK_LIBRARIES (executable_name Function)

# 3、使用 cmake 命令生成 Makefile 文件
cmake .

# 4、使用 make 命令
make

多目录多文件的标准工程结构

# 0、项目工程结构
mkdir project_name
cd project_name
mkdir src
cd src
touch Main.cpp CMakeLists.txt
vim Main.cpp
vim CMakeLists.txt
cd ..
mkdir lib
cd lib 
touch CMakeLists.txt Function.cpp Function.hpp 
vim CMakeLists.txt Function.cpp Function.hpp
cd ..
mkdir build

# 1、编写 src 文件夹下的 CMakeLists.txt 文件
# 添加头文件搜索路径 = project_name/lib
INCLUDE_DIRECTORY (${PROJECT_SOURCE_DIR}/lib)

# 设置 生成可执行程序的输出路径 = build/bin
SET (EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

# 自动搜索路径下所有的源文件赋值给变量
AUX_SOURCE_DIRECTORY (./ src_dir)

# 生成可执行文件
ADD_EXECUTABLE (executable_name ${src_dir})

# 链接静态库文件 Function
TARGET_LINK_LIBRARIES (executable_name Function)

# 2、编写 lib 文件夹下的 CMakeLists.txt 文件
# 自动搜索路径下所有的源文件赋值给变量
AUX_SOURCE_DIRECTORY (. src_dir)

# 设置 生成库的输出路径 = build/lib
SET (LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

# 添加静态库 STATIC 动态库 SHARE
ADD_LIBRARY (Function STATIC ${src_dir})

# 3、编写 project_name 文件夹下的 CMakeLists.txt 文件(顶层 CMakeLists.txt)
# CMake 要求最低版本
CMAKE_MINIMUM_REQUIRED (VERSION 3.5)

# 项目工程名称以及工程支持的语言
PROJECT (project_name [CXX][C][JAVA])

# 添加工程目录的依赖的源文件的子目录
ADD_SUBDIRECTORY (./lib)
ADD_SUBDIRECTORY (./src)

# 4、使用 cmake 命令生成 Makefile 文件
# 采用外部编译
cd build
cmake ..

# 5、使用 make 命令
make

自定义编译选项

# 0、项目工程结构
mkdir project_name
cd project_name
mkdir src
cd src
touch Main.cpp CMakeLists.txt
vim Main.cpp
vim CMakeLists.txt
cd ..
mkdir lib
cd lib 
touch CMakeLists.txt Function.cpp Function.hpp 
vim CMakeLists.txt Function.cpp Function.hpp
cd ..
mkdir build
mkdir config
cd config
touch config.hpp.in

# 1、编写 src 文件夹下的 CMakeLists.txt 文件
# 设置 生成可执行程序的输出路径 = build/bin
SET (EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

# 配置自定义编译选项部分 = "input" "output"
CONFIG_FILE ("${PROJECT_SOURCE_DIR}/config/config.hpp.in" 
             "${PROJECT_SOURCE_DIR}/config/config.hpp.in" 
             )
# 自定义编译选项 宏定义
OPTION (USE_MATH
        ON
        )
# 条件编译 = 使用自己编写的库,否则使用第三方库
IF(USE_MATH)
# 添加头文件搜索路径 = project_name/lib
INCLUDE_DIRECTORY (${PROJECT_SOURCE_DIR}/lib)
ENDIF(USE_MATH)

# 自动搜索路径下所有的源文件赋值给变量
AUX_SOURCE_DIRECTORY (./ src_dir)

# 生成可执行文件
ADD_EXECUTABLE (executable_name ${src_dir})

# 链接静态库文件 Function
TARGET_LINK_LIBRARIES (executable_name Function)

# 2、编写自定义编译选项文件 
cd config
vim config.hpp.in
# 添加以下内容——自定义编译选项
#cmakedefine USE_MATH

# 3、编写 lib 文件夹下的 CMakeLists.txt 文件
# 自动搜索路径下所有的源文件赋值给变量
AUX_SOURCE_DIRECTORY (. src_dir)

# 设置 生成库的输出路径 = build/lib
SET (LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

# 添加静态库 STATIC 动态库 SHARE
ADD_LIBRARY (Function STATIC ${src_dir})

# 4、编写 project_name 文件夹下的 CMakeLists.txt 文件(顶层 CMakeLists.txt)
# CMake 要求最低版本
CMAKE_MINIMUM_REQUIRED (VERSION 3.5)

# 项目工程名称以及工程支持的语言
PROJECT (project_name [CXX][C][JAVA])

# 添加工程目录的依赖的源文件的子目录
ADD_SUBDIRECTORY (./lib)
ADD_SUBDIRECTORY (./src)

# 5、使用 cmake 命令生成 Makefile 文件
# 采用外部编译
cd build
cmake ..

# 6、使用 make 命令
make
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值