1、编译过程
- 预处理-Pre-Processing //.i文件
# -E 选项指示编译器仅对输入文件进行预处理
g++ -E test.cpp -o test.i //.i文件
- 编译-Compiling // .s文件
# -S 编译选项告诉 g++ 在为 C++ 代码产生了汇编语言文件后停止编译
# g++ 产生的汇编语言文件的缺省扩展名是 .s
g++ -S test.i -o test.s
- 汇编-Assembling // .o文件
# -c 选项告诉 g++ 仅把源代码编译为机器语言的目标代码
# 缺省时 g++ 建立的目标代码文件有一个 .o 的扩展名。
g++ -c test.s -o test.o
- 链接-Linking // bin文件
# -o 编译选项来为将产生的可执行文件用指定的文件名
g++ test.o -o test
但是这样编译太不方便了,接下来学习用cmake构建工程。
2、最小CMake工程
# Set the minimum version of CMake that can be used
cmake_minimum_required(VERSION 3.0)
# Set the project name
project (HELLO)
# Add an executable
add_executable(hello_cmake main.cpp)
3、常用CMake命令理解
3.1 设置工程相关
- cmake_minimum_required 指定CMake的最小版本要求
- project 定义工程名称,并可指定工程支持的语言
- set 显式的定义变量
- add_compile_options 添加编译参数
3.2 设置项目内部include和lib
- include_directories 向工程添加多个特定的头文件搜索路径 --->相当于指定g++编译器的-I参数
- link_directories 向工程添加多个特定的库文件搜索路径 --->相当于指定g++编译器的-L参数
3.3 设置(三方)库相关
- target_include_directories 为 target 添加需要链接的共享库所在的路径-->相当于制定(三方)库路径
- target_link_libraries 为 target 添加需要链接的共享库 -->相同于指定g++编译器-l参数
3.4 设置参与编译的cpp是生成库还是可执行文件
- add_library 生成库文件
- add_executable 生成可执行文件
3.5 设置文件夹
- add_subdirectory 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
- aux_source_directory 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表
4、实战升级
4.1 简单设置项目头文件
4.2 多文件夹应用
文件格式
顶层cmakelist
cmake_minimum_required(VERSION 3.10.3)
project(planning
VERSION 0.0.1
DESCRIPTION "cmake multidir demo"
HOMEPAGE_URL ""
LANGUAGES CXX
)
set(CMAKE_CXX_STANDARD 14)
#设置变量
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
set(Process_Dir ${CMAKE_SOURCE_DIR}/src/process)
set(addition_Dir ${CMAKE_SOURCE_DIR}/src/addition)
# 添加子目录-最顶层只添加src
add_subdirectory(src)
src文件所在文件夹下的cmake
project(cmake_demo)
#添加子文件夹
add_subdirectory(addition)
add_subdirectory(process)
#设置可执行文件
add_executable(${PROJECT_NAME} cmake_demo_main.cpp)
##=====================设置项目中 inclue lib =====================
#设置需要链接的模块的include路径
target_include_directories(${PROJECT_NAME}
PUBLIC
${Process_Dir}
)
#需要链接的库文件,输入是库名称
target_link_libraries(${PROJECT_NAME}
PUBLIC
process
)
##=====================设置外部中 inclue lib =====================
addition动态链接库cmake
project(addition)
add_library(${PROJECT_NAME}
SHARED
addition.cpp
)
process动态链接库cmake,process库调用了addtion库
project(process)
add_library(${PROJECT_NAME}
SHARED
process.cpp
)
#设置需要链接的模块的include路径
target_include_directories(${PROJECT_NAME}
PUBLIC
${addition_Dir}
)
#需要链接的库文件,输入是库名称
target_link_libraries(${PROJECT_NAME}
PUBLIC
addition
)
#include "process.h"
int process::print()
{
addition map;
int a = 10;
int b = 11;
std::string c = "helloworld";
return map.add(a,b,c);
}
备注:mian函数所在的文件夹要带main字眼
4.3 引用开源三分库(以eigen为例子)
想写详细点,见下一篇文章
5、参考文章
【C++】Cmake使用教程(看这一篇就够了) - 知乎 (zhihu.com)