CMake

CMake_第1张图片

CMake

CMake 只是“构建的规划工具”,不是库的安装工具。

CMake 是一个跨平台的自动化构建系统,主要用于管理 C/C++ 项目的编译过程。它使用一种 平台无关的配置文件(CMakeLists.txt) 来生成本地的构建文件,比如 Makefile、Ninja 文件,或者 Visual Studio 的工程文件等。


优势:

  • 不依赖特定编译器或 IDE

  • 支持模块化构建(子目录、第三方库)

  • 支持导出编译配置(如 compile_commands.json)

  • 与 IDE(如 CLion、VSCode)深度集成

构建流程:

# 在项目根目录外创建一个 build 目录
mkdir build
cd build

# 运行 cmake,生成 Makefile 或其他构建系统文件
cmake ..

# 编译(使用生成的 Makefile)
make
# -B(Build):指定构建目录(生成的 Makefile 或 Ninja 文件会放这里)
# -S(Source):指定源码目录(CMakeLists.txt 所在目录)

cmake -B .      # 表示在当前目录生成构建文件
cmake -B build  # 表示在 build 子目录生成构建文件(推荐做法)

CMakeLists.txt 示例

cmake_minimum_required(VERSION 3.10)
project(MyApp)

# 指定 C++ 标准
set(CMAKE_CXX_STANDARD 17)

# 添加源码文件
add_executable(MyApp main.cpp utils.cpp)

构建动态库:

# 设置 CMake 最低版本要求
# cmake_minimum_required(VERSION 3.10)

# 设置项目名称
project(AsyncLogger)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")

# 添加头文件搜索路径
include_directories(include include/dbwg)

# 查找所有源文件
file(GLOB_RECURSE SOURCES "src/*.cpp")

# 生成动态库
add_library(async_logger SHARED ${SOURCES})

# 设置安装前缀
set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}/../cmake_out)
message("CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")

# 设置动态库的安装路径
install(TARGETS async_logger DESTINATION lib)
install(DIRECTORY include/ DESTINATION include)

某个 跨平台的 C++ OpenGL 项目配置:

# cmake version
cmake_minimum_required(VERSION 3.1)

# c++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)  # 禁止使用编译器特定的扩展

# vcpkg
if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
  set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
      CACHE STRING "")
endif()
if(DEFINED ENV{VCPKG_DEFAULT_TRIPLET} AND NOT DEFINED VCPKG_TARGET_TRIPLET)
  set(VCPKG_TARGET_TRIPLET "$ENV{VCPKG_DEFAULT_TRIPLET}" CACHE STRING "")
endif()

# project
project(main)

# target
aux_source_directory("./" PROJECT_SOURCES)
add_executable(main ${PROJECT_SOURCES})
target_include_directories(main PRIVATE include)

if(APPLE)
	# dependency
	include_directories(/System/Library/Frameworks)
	find_library(OpenGL_LIBRARY OpenGL)
	find_library(GLUT_LIBRARY GLUT)
	set(LIBS ${OpenGL_LIBRARY} ${GLUT_LIBRARY})
	# link
	target_link_libraries(main ${LIBS})
else()
	# dependency
	find_package(glad CONFIG REQUIRED)
	find_package(glfw3 CONFIG REQUIRED)
	find_package(glm CONFIG REQUIRED)
	# link
	target_link_libraries(main PRIVATE glad::glad)
   	target_link_libraries(main PRIVATE glfw)
	target_link_libraries(main PRIVATE glm::glm)
endif(APPLE)

你可能感兴趣的:(个人学习博客,c)