CMake了解一下?

假如我们在windows平台用Visual Studio开发了一个C++项目,现在要跨平台,要移植到linux上。VS工程肯定没法在linux平台上跑的,而linux平台通常使用Makefile构建项目,所以我们还要再写一个Makefile。这还只是两个平台,其实每个平台的构建工具都不太一样:

这是编写跨平台软件的第一大障碍,构建工具都不一样。CMake正是为了解决这个问题诞生的,用CMake构建的项目可以转成任意的工程:

image

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})
posted @ 2021-04-30 15:25:00
评论加载中...
发表评论