CMAKE的使用
视频路径:
https://www.bilibili.com/video/BV14s4y1g7Zj/?spm_id_from=333.337.search-card.all.click&vd_source=b3723521e243814388688d813c9d475f
https://subingwen.cn/cmake/CMake-primer/
1.最简单的CMakeLists
1.1代码:
add.cpp
#include <stdio.h>
#include "head.h"
int add(int a, int b)
{
return a+b;
}
div.cpp
#include <stdio.h>
#include "head.h"
double divide(int a, int b)
{
return (double)a/b;
}
main.cpp
#include <stdio.h>
#include "head.h"
int main()
{
int a = 20;
int b = 12;
printf("a = %d, b = %d\n", a, b);
printf("a + b = %d\n", add(a, b));
printf("a - b = %d\n", subtract(a, b));
printf("a * b = %d\n", multiply(a, b));
printf("a / b = %f\n", divide(a, b));
return 0;
}
mult.cpp
#include <stdio.h>
#include "head.h"
int multiply(int a, int b)
{
return a*b;
}
sub.cpp
#include <stdio.h>
#include "head.h"
// 你好
int subtract(int a, int b)
{
return a-b;
}
head.h
#ifndef _HEAD_H
#define _HEAD_H
// 加法
int add(int a, int b);
// 减法
int subtract(int a, int b);
// 乘法
int multiply(int a, int b);
// 除法
double divide(int a, int b);
#endif
CMakeLists.txt
#这是一个CmakeLists.txt文件
#[[这是多行注释
]]
#指定出要求的最低Cmake版本
cmake_minimum_required(VERSION 3.0)
project(test)
add_executable(app add.cpp div.cpp main.cpp mult.cpp sub.cpp)
1.2执行步骤
首先,创建build目录,
在build目录中执行cmake .. 命令,
然后执行make命令,
会产生目标app。
问题:add_executable中的第二个参数太长了,怎么办?
将这些内容存在变量中
2.第二小节
2.1 通过set定义变量
2.2设置C++标准,如C++11 C++14 C++17 C++20; 通过CMKAE_CXX_STANDARD = 11/14/17/20
2.3通过set给生成可执行文件设置路径,
set{HOME /home/robin/Linux/Sort}
set{EXECUTABLE_OUTPUT_PATH ${PATH}/bin}
3.第三小节
#version 1.1
#在1.1的基础上将add_executable第二个变量中的元素存储在变量中
#设置Cmake版本
cmake_minimum_required(VERSION 3.31)
project(test)
#设置变量来存储这些.cpp文件
set(SRC_LIST add.cpp div.cpp main.cpp mult.cpp sub.cpp)
//设置可执行文件路径,如果路径不存在,则会创建这个路径
set(EXECUTABLE_OUTPUT_PATH /home/book/aa/bb/cc)
//设置C++标准为C++11
set(CMAKE_CXX_STANDARD 11)
add_executable(app ${SRC_LIST})
也可以在后边cmake的时候指定C++标准
cmake .. -DCMAKE_CXX_STANDARD=11
4.第四小节
搜索文件夹中的文件
方式1:
# 其中${PROJECT_SOURCE_DIR} 代表
# 的是cmake 后边指定的那个路径,
# 将这个文件夹中的文件存储到SRC中
aux_source_directory(${PROJECT_SOURCE_DIR} SRC)
方式2:
#这里后边要指定文件的后缀, .cpp
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
cmake_minimum_required(VERSION 3.31)
project(test)
#PROJECT_SOURCE_DIR 代表执行Cmake时候后边跟随的命令
#aux_source_directory(${PROJECT_SOURCE_DIR} SRC)
#set(SRC_LIST add.cpp div.cpp main.cpp mult.cpp sub.cpp)
#CMAKE_CURRENT_SOURCE_DIR 代表的是CMakeLists.txt文件所在目录中的文件
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
set(EXECUTABLE_OUTPUT_PATH /home/book/aa/bb/cc)
set(CMAKE_CXX_STANDARD 11)
add_executable(app ${SRC})
5.第五小节
分文件编写
但是会出现问题:找不到头文件
使用include_directories() 解决
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
6.将当前项目中的文件编译成库文件(动态库和静态库)
通过这四个文件制作运算库,命令为
add_library()
6.1静态库的制作
6.2动态库的制作
#version 1.5
#动态库的制作
cmake_minimum_required(VERSION 3.31)
project(test)
#PROJECT_SOURCE_DIR 代表执行Cmake时候后边跟随的命令
#aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC)
#set(SRC_LIST add.cpp div.cpp main.cpp mult.cpp sub.cpp)
#CMAKE_CURRENT_SOURCE_DIR 代表的是CMakeLists.txt文件所在目录中的文件
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
#set(EXECUTABLE_OUTPUT_PATH /home/book/aa/bb/cc)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
set(CMAKE_CXX_STANDARD 11)
#add_executable(app ${SRC})
add_library(calc STATIC ${SRC})
6.3库的使用
发布的时候要发布库文件和头文件
指定生成的库文件的路径
set(LIBRARY_OUTPUT_PATH /home/book/nfs_rootfs/CSDN/abcdefg)
#version 1.5
#动态库的制作
cmake_minimum_required(VERSION 3.31)
project(test)
#PROJECT_SOURCE_DIR 代表执行Cmake时候后边跟随的命令
#aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC)
#set(SRC_LIST add.cpp div.cpp main.cpp mult.cpp sub.cpp)
#CMAKE_CURRENT_SOURCE_DIR 代表的是CMakeLists.txt文件所在目录中的文件
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
#set(EXECUTABLE_OUTPUT_PATH /home/book/aa/bb/cc)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
set(CMAKE_CXX_STANDARD 11)
#add_executable(app ${SRC})
#add_library(calc STATIC ${SRC})
add_library(calc SHARED ${SRC})
set(LIBRARY_OUTPUT_PATH /home/book/nfs_rootfs/CSDN/abcdefg)
7.在程序中链接静态库
#version 1.5
#动态库的制作
cmake_minimum_required(VERSION 3.31)
project(test)
#PROJECT_SOURCE_DIR 代表执行Cmake时候后边跟随的命令
#aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC)
#set(SRC_LIST add.cpp div.cpp main.cpp mult.cpp sub.cpp)
#CMAKE_CURRENT_SOURCE_DIR 代表的是CMakeLists.txt文件所在目录中的文件
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
#set(EXECUTABLE_OUTPUT_PATH /home/book/aa/bb/cc)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
set(CMAKE_CXX_STANDARD 11)
#add_executable(app ${SRC})
#add_library(calc STATIC ${SRC})
#add_library(calc SHARED ${SRC})
#set(LIBRARY_OUTPUT_PATH /home/book/nfs_rootfs/CSDN/abcdefg)
link_libraries(calc)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib1)
add_executable(app ${SRC})
视频看到这里了