#win平台执行命令“cmake -G "MinGW Makefiles" .”进行cmake,之后执行命令“mingw32-make”进行make
# 声明cmake工程的名字,同时声明本项目是一个C/C++项目(必须)
project(add LANGUAGES C CXX)
# 打印相关消息消息
MESSAGE(STATUS "Project: add")
# 声明cmake的最低版本
cmake_minimum_required(VERSION 3.4)
message(STATUS "Current Cmake Version > VERSION 3.4")
# 设置CMake的build模式为DEBUG
# Debug(调试):此build type通常用于开发和调试阶段。它包含了调试信息,不进行任何优化,以便在调试时能够更轻松地追踪代码。
# Release(发布):Release build type通常用于生产环境中。它会启用各种优化选项,以提高代码的执行速度和效率。
# RelWithDebInfo(发布带调试信息):这种build type结合了Release和Debug的特性,旨在提供一种较好的优化效果同时保留调试信息,以便在需要时进行调试。
# MinSizeRel(最小体积发布):MinSizeRel build type旨在最小化可执行文件的大小,通常会启用一些针对代码大小的优化。
#SET(CMAKE_BUILD_TYPE Debug)
SET(CMAKE_BUILD_TYPE "Debug")
#SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
#SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
# 打印设置的编译模型信息
MESSAGE("Build type: " ${CMAKE_BUILD_TYPE})
# 添加c++11标准支持 【可选】
set( CMAKE_CXX_FLAGS "-std=c++17")
# 检查C++版本 【可选】 , Check C++11 or C++0x support
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++17" COMPILER_SUPPORTS_CXX17)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
add_definitions(-DCOMPILEDWITHC17)
message(STATUS "Using flag -std=c++17.")
elseif(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
add_definitions(-DCOMPILEDWITHC0X)
message(STATUS "Using flag -std=c++0x.")
else()
message(FATAL_ERROR "Compiler check failed.")
endif()
# 将main之外的c/cpp文件编译成库文件(动态/静态),方便日后其他项目链接使用,
set(LIB_NAME addNums)
#可以用add_library创建库对象
set(SRC_ADD_CPP ${PROJECT_SOURCE_DIR}/src/add.cpp)
add_library(${LIB_NAME} STATIC ${SRC_ADD_CPP})
# 指定库代码包含的include头文件目录
target_include_directories(${LIB_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/include)
# 如果自己的库依赖了三方库,需要 target_link_libraries 链接使用到的三方库(可选)
#target_link_libraries(my_shared_lib PRIVATE some_other_lib)
# 将函数入口,及涉及的所有cpp/c源代码写在参数中,触发cmake进行编译,生成exe可执行文件,一个exe对应一个add_executable
set(SRC_MAIN_CPP ${PROJECT_SOURCE_DIR}/src/main.cpp)
add_executable(${PROJECT_NAME} ${SRC_MAIN_CPP} )
target_compile_options(${PROJECT_NAME} PRIVATE -g)
# 如果代码中使用了.a或者.so等三方库,需要使用下述命令查找库
# find_library(EXTERNAL_LIB_NAME_VAR1 EXTERNAL_LIB_NAME1.a PATH_TO_EXTERNAL_LIB_NAME1)
# 将编译后的exe可执行程序,和所需库文件(动态库/静态库)进行链接(可选,如果没用到三方库不需要编写target_link_libraries)
target_link_libraries(${PROJECT_NAME} ${LIB_NAME})
# 设置自己的静态库,动态库,和最终生成的.exe可执行文件的输出路径
set_target_properties(${LIB_NAME} ${PROJECT_NAME} PROPERTIES
#设置静态库输出路径
ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib
ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/lib
ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/lib
#设置动态库输出路径
LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib
LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/lib
LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/lib
#设置可执行文件输出路径
RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin
)
MESSAGE(STATUS "Set .lib/.a output dir: ${PROJECT_SOURCE_DIR}/lib")
MESSAGE(STATUS "Set .dll/.so output dir: ${PROJECT_SOURCE_DIR}/lib")
MESSAGE(STATUS "Set .exe output dir: ${PROJECT_SOURCE_DIR}/bin")