假如我们在windows平台用Visual Studio开发了一个C++项目,现在要跨平台,要移植到linux上。VS工程肯定没法在linux平台上跑的,而linux平台通常使用Makefile构建项目,所以我们还要再写一个Makefile。这还只是两个平台,其实每个平台的构建工具都不太一样:
这是编写跨平台软件的第一大障碍,构建工具都不一样。CMake正是为了解决这个问题诞生的,用CMake构建的项目可以转成任意的工程:
CMake只是一层抽象,本身并不提供构建功能,所以CMake最终一定会转换成其他的构建工具。
目录树:
.
├── CMakeLists.txt
├── include
│ └── test.h
└── src
├── main.cpp
└── test.cpp
2 directories, 4 files
CMakeLists.txt内容
# 项目需要的cmake版本和项目名字
cmake_minimum_required(VERSION 3.19)
project(test)
# 头文件目录
include_directories(include)
# 项目文件
file(GLOB SOURCES "src/*.cpp")
# 生成可执行文件
add_executable(a.out ${SOURCES})
cmake会生成一些临时文件,如果不想这些文件生成到项目根目录可以这样做:
mkdir build && cd build
cmake ..
执行成功后会生成Makefile,然后再用make工具构建项目:
make
假设我们需要用的c++发送http请求,使用http库:https://github.com/yhirose/cpp-httplib。
这个库只有头文件,只需要引入头文件即可,不过这个库需要ssl库才可以访问https,所以我们还得添加ssl库:
# 项目名字和项目需要的cmake版本
cmake_minimum_required(VERSION 3.19)
project(test)
# c++版本
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 编译选项
add_compile_options(-Wall)
# 项目头文件
include_directories(include)
# http库
include_directories(cpp-httplib)
# 添加ssl库
include_directories(/usr/local/opt/openssl/include)
set(PROJECT_LINK_LIBS libcrypto.a libssl.a)
link_directories(/usr/local/opt/openssl/lib)
# 项目文件
file(GLOB SOURCES "src/*.cpp")
# 生成可执行文件
add_executable(a.out ${SOURCES})
target_link_libraries(a.out ${PROJECT_LINK_LIBS})