设置cmake最低版本

1
cmake_minimum_required(VERSION 3.0)

设置项目名称

1
project(rtpsender)

设置源码路径

1
2
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) # 搜索文件,绝对路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) # 头目录

设置库目录

1
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)           # 库目录

设置输出目录

1
2
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) # 库输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) # 可执行程序输出路径

生成二进制

1
2
3
4
5
6
#set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) # windows下导出所有符号
add_library(calc STATIC ${SRC_LIST}) #生成静态库

add_library(calc SHARED ${SRC_LIST}) #生成动态库

add_executable(app ${SRC_LIST}) # 生成可执行程序

链接库

注:链接库一定要在生成可执行程序之后

1
target_link_libraries(app pthread calc) # 链接动态/静态库

编译细节输出

1
set(CMAKE_VERBOSE_MAKEFILE ON) 

判断编译环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
if(WIN32)
message(STATUS "This is windows.")
elseif(UNIX)
message(STATUS "This is UNIX.")
endif()

if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
message(STATUS "Operating system is Windows")
elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux")
message(STATUS "Operating system is Linux")
elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
message(STATUS "Operating system is macOS")
else ()
message(STATUS "Unknown operating system")
endif ()

if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "amd64")
message(STATUS "CPU architecture is x86_64 (64-bit)")
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "i686" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i386")
message(STATUS "CPU architecture is x86 (32-bit)")
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "arm" OR CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
message(STATUS "CPU architecture is ARM")
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "ppc" OR CMAKE_SYSTEM_PROCESSOR MATCHES "powerpc")
message(STATUS "CPU architecture is PowerPC")
else ()
message(STATUS "Unknown CPU architecture: ${CMAKE_SYSTEM_PROCESSOR}")
endif ()

忽略库rpath

1
set(CMAKE_SKIP_RPATH TRUE)

添加宏定义

1
add_definitions(-D宏名称=x)

设置编译版本

1
2
3
4
# SET(CMAKE_BUILD_TYPE "Debug") # 默认
SET(CMAKE_BUILD_TYPE "Release")

# msvc上述命令无用,需要在编译时指定 cmake --build . --config Release

设置编译器标志以生成32位代码

1
2
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")

MSVC设置32位or64位

1
2
3
4
5
cmake .. -G "Visual Studio 14 2015" # 默认32位
cmake .. -G "Visual Studio 14 2015" -A x64 # 64位

cmake .. -G "Visual Studio 17 2022" # 默认64位
cmake .. -G "Visual Studio 17 2022" -A Win32 # 32位

vs2015下载链接 http://download.microsoft.com/download/5/d/1/5d1ec81e-bc59-448f-9ab6-27636d5cc18a/vs2015.3.com_chs.iso

输出list

1
# message("source: ${SRC_LIST}")   # 打印

修改list

1
2
list(APPEND SRC_LIST ${SRC_1} ${SRC_2} ...)  # 追加:SRC_LIST = SRC_1 + SRC_2 + ...
list(REMOVE_ITEM SRC_LIST ${PROJECT_SOURCE_DIR}/main.cpp) # 去除

生成项目

1
2
3
mkdir build
cd build
cmake .. #-DCMAKE_GNUtoMS=ON MinGW生成动态库加上这个可以供MSVC链接

重新生成项目

1
cmake -S .. -B build

生成二进制

Linux

方法一

1
make

方法二

1
cmake --build .

windows

1
2
cmake --build . # 生成Debug版本
cmake --build . --config release # 生成Release版本

指定编译器

1
cmake -G # 列举支持的编译器
1
cmake .. -G "MinGW Makefiles" # 指定为MinGW

1
2
3
4
5
6
7
8
9
10
11
root@DESKTOP-RXXXXXT:~/easyrtp# tree
.
|-- CMakeLists.txt
|-- build
|-- include
| `-- easyrtp.h
`-- src
|-- easyrtp.cpp
`-- main.cpp

4 directories, 4 files
1
2
3
4
5
6
7
8
cmake_minimum_required(VERSION 3.0) # cmake 版本
project(rtpsender) # 项目名字
SET(CMAKE_BUILD_TYPE "Debug")

file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) # 搜索文件,绝对路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) # 头目录

add_executable(app ${SRC_LIST}) # 生成可执行程序

2025-01-05更新

关于 MinGW 和 MSVC对通问题,测试过了,在不改代码的情况下:MinGW生成的动态库MSVC不能链接;MSVC生成的动态库MinGW也不可以链接(网上说的dlltool我试了,没用。)

可以改代码的情况下,MinGW生成的动态库MSVC可以链接

解决windows中文乱码问题

1
add_compile_options("/source-charset:utf-8") # Visual Studio 2015 Update 2(版本 14.0.23918)及以上
1
add_compile_options(-fexec-charset=GBK) # MinGW64

查看cmake选项

1
cmake .. -LH