SUI/CMakeLists.txt
2024-10-03 20:17:18 +08:00

103 lines
3.7 KiB
CMake

#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
)