#cmake最低版本 cmake_minimum_required(VERSION 3.16) #项目版本 project(SUI VERSION 1.0 LANGUAGES CXX) #设置moc ui rcc编译开关 SET(CMAKE_AUTOMOC ON) SET(CMAKE_AUTOUIC ON) SET(CMAKE_AUTORCC ON) #设置C++版本 set(CMAKE_CXX_STANDARD 17) #包含所有.h文件 SET(CMAKE_INCLUDE_CURRENT_DIR ON) #release编译下依然输出符号和行号 #ADD_DEFINITIONS(-DQT_MESSAGELOGCONTEXT) #编译类型 debug和release输出路径 set(CMAKE_VERBOSE_MAKEFILE ON) SET(CMAKE_CXX_FLAGS"-Wall -Wextra") SET(CMAKE_CXX_FLAGS_RELEASE"-O3 -s") set(CMAKE_BUILD_TYPE "Release") message(STATUS "----------编译模式 START-------------") if(NOT CMAKE_BUILD_TYPE) message(STATUS "[CMAKE_BUILD_TYPE]当前值[Debug]") SET(CMAKE_BUILD_TYPE "Debug") SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/build/debug) else() message(STATUS "[CMAKE_BUILD_TYPE]当前值[Release]") SET(CMAKE_BUILD_TYPE "Release") SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/release) endif() message(STATUS "----------编译模式 END---------------") #设置QT .cmake文件路径 SET(QT_DIR "D:/Dev/Qt/6.3.2/mingw1120_static_x64_base/lib/cmake") SET(MSYS2 "D:/Dev/msys64/mingw64") list(APPEND CMAKE_PREFIX_PATH ${QT_DIR} ${MSYS2}) #查找QT模块 find_package(Qt6 REQUIRED Core Gui Widgets Network) #输出路径 message(STATUS "----------基础路径输出 START-------------") message(STATUS "QT_DIR_PATH=${QT_DIR}") message(STATUS "MSYS2_DIR_PATH=${MSYS2}") message(STATUS "----------基础路径输出 END---------------") FILE(GLOB src "${PROJECT_SOURCE_DIR}/src/*.cpp" "${PROJECT_SOURCE_DIR}/src/*.h") set(PROJECT_SOURCES main.cpp ${src} ) #资源文件 qt6_add_resources(RCFILES suires.qrc) #WIN32 add_executable(${PROJECT_NAME} WIN32 ${PROJECT_SOURCES} ${RCFILES} sui.rc) #增加winpthread和gcc_s静态库 SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-Wl,-Bstatic -lwinpthread -Wl,-Bstatic -lz -Wl,-Bstatic -lgcc_s") #安全编译 #关闭RPATH特性 SET(CMAKE_SKIP_RPATH TRUE) #开启栈保护 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong") #开启GOT表保护 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,relro,-z,now") SET(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -Wl,-z,relro,-z,now") #开启栈不可执行 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,noexecstack") SET(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -Wl,-z,noexecstack") #开启地址无关 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic") #随机化 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpie") SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pie") SET(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -pie") #隐藏暴露的符号 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fvisibility=hidden") SET(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -fvisibility=hidden") SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fvisibility-inlines-hidden") SET(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -fvisibility-inlines-hidden") #删除调试符号 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s") SET(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -s") #开启整数溢出检查 SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -ftrapv") #开启栈检查 SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -fstack-check") #忽略多重定引用 target_link_options(${PROJECT_NAME} PUBLIC -Wl,--allow-multiple-definition) target_link_libraries( ${PROJECT_NAME} PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets Qt6::Network )