CMake学习笔记
CMake 学习笔记
Cmake是用于构建,测试和软件打包的开源跨平台工具(不是包或者语言)。
预处理(preprocess)–>编译(complie)–>汇编(assemble)–>链接(link)
.cpp–>C++ preprocess–>Complier–>.s–>.o/.obj–>Linker–>Executable file
C++中的预处理指令以#开头。预处理指令在程序编译之前被处理,用于告诉编译器在编译过程中要进行的一些操作。常见的预处理指令有#include、#define、#ifdef等,它们可以用来包含头文件、定义宏、进行条件编译等。
g++ -E main.cpp -o main.i
检查代码规范性和语法错误等,检查完毕把代码翻译成汇报语言文件。
g++ -S main.i -o main.s
汇编文件首先需要通过汇编器将其转换成二进制格式的目标文件。
g++ -c main.s -o main.o
链接器将一个或多个目标文件合并成一个可执行文件,将目标代码与所依赖库文件进行关联。
g++ main.o -o main
静态链接库和动态链接库区别在于链接阶段不一样。静态链接库是在编译过程进行链接,在运行时内存中会有多份static library;动态链接库是在执行过程中进行链接,在运行时内存中只有一份shared library。
#include
int main()
{
std::cout << "hello word" << std::endl;
return 0;
}
代码如下:
Cmake_minimum_required(VERSION 3.20.0) #最小版本
project(Hello)#项目名
add_executable(Hello main.cpp)#由源文件生成一个可执行程序
代码如下:
cmake -B build
创建一个build并在此目录下生成makefile或其他文件,构建文件定义了编译源代码链接库,生成可执行文件等配置信息。
cmake --build build
cmake_minimum_required(VERSION 3.20.0)
project(Hello)
#添加静态库
add_library(slib STATIC src/slib.cpp include/slib.h)
target_include_directories(slib PUBLIC include)
#添加动态库
add_library(dlib SHARED src/dlib.cpp include/dlib.h)
target_include_directories(dlib PUBLIC include)
#添加可执行文件
add_executable(${PROJECT_NAME} main.cpp)
#链接库
target_link_libraries(${PROJECT_NAME} slib dlib)
install(
TARGETS ${PROJECT_NAME} slib dlib
RUNTIME DESTINTION bin #可执行文件
LIBRARY DESTINATION lib #动态库
ARCHIVE DESTINATION lib #静态库
)
#[[
运行方式
cmake -B build -DCMAKE_INSTALL_PREFIX='安装路径'
cmake --build build
cmake --install build
]]
PROJECT (HELLO) 指定了⼯程的名字,并且⽀持所有语⾔—建议
PROJECT (HELLO CXX) 指定了⼯程的名字,并且⽀持语⾔是C++
PROJECT (HELLO C CXX) 指定了⼯程的名字,并且⽀持语⾔是C和C++
⽤来显示的指定变量的
SET(SRC_LIST main.cpp) SRC_LIST变量就包含了main.cpp
也可以 SET(SRC_LIST main.cpp t1.cpp t2.cpp)
向终端输出⽤户⾃定义的信息
ADD_EXECUTABLE(HELLO hello.cpp)
注意:⼯程名的 HELLO 和⽣成的可执⾏⽂件 hello 是没有任何关系的
示例:target_link_library(A,B)
PUBLIC:
B link A ,如果 C link A,则C link B
B 用于A的实现,也在头文件中给C用
PRIVATE:
依赖项B仅连接到目标A,如果C link A ,C也不会link B
B仅用于A的实现,不在头文件中给C用
INTERFACT:
B 没link A ,如果 C link A ,C也不会link B
B不用于A的实现,但在头文件中接口给C用
if条件
if(<condition>)
<commands>
elseif(<condition>)
<commands>
else()
<commands>
endif()
loop循环流程控制(for/while)
For
foreach(<loop_var>RANGE<max>)
<commands>
endforeach()
宏:在编译阶段进行文本替换
函数:在执行阶段调用,是一段可以在程序中被重复调用的代码块
macor(<name>[<argument>...]
<commands>
endmacro()
function(<name>[<argument>...]
<commands>
endfunction()
对Cmake基础知识简单总结,后续会继续补充。
参考视频链接: link