feat: add CMake support for Linux

This commit is contained in:
2026-01-04 09:10:01 +08:00
parent 0885e925ad
commit d1c1d2a9ea

View File

@@ -5,19 +5,19 @@ project(SporeBG-Conid LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$<CONFIGURATION>")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$<CONFIGURATION>")
# 输出目录 - 修复配置问题
if(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$<CONFIGURATION>")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$<CONFIGURATION>")
else()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
endif()
include(${CMAKE_SOURCE_DIR}/cmake/ThirdParty.cmake)
include(${CMAKE_SOURCE_DIR}/cmake/SDL.cmake)
# ========== 源码 ==========
#file(GLOB_RECURSE SOURCE_FILES
# src/*.cpp
# src/*.h
#)
set(SOURCE_FILES
src/main.cpp
src/core/GameApplication.cpp
@@ -54,62 +54,35 @@ set(SOURCE_FILES
)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
target_include_directories(${PROJECT_NAME} PRIVATE
${CMAKE_SOURCE_DIR}/src
${asio_SOURCE_DIR}/asio/include
)
# ========== Windows: 定义宏 & 链接库 ==========
if (WIN32)
target_compile_definitions(${PROJECT_NAME} PRIVATE
ASIO_STANDALONE
_WIN32_WINNT=0x0A00
)
target_link_libraries(${PROJECT_NAME}
PRIVATE
SDL3::SDL3
SDL3_ttf::SDL3_ttf
SDL3_image::SDL3_image
nlohmann_json::nlohmann_json
ws2_32
mswsock
advapi32
)
endif()
# ========== Windows: 复制 DLL ==========
# ========== 平台特定设置 ==========
if (WIN32)
# 查找 MinGW 运行时库
target_compile_definitions(${PROJECT_NAME} PRIVATE
ASIO_STANDALONE
_WIN32_WINNT=0x0A00
)
target_link_libraries(${PROJECT_NAME}
PRIVATE
SDL3::SDL3
SDL3_ttf::SDL3_ttf
SDL3_image::SDL3_image
nlohmann_json::nlohmann_json
ws2_32
mswsock
advapi32
)
# Windows: DLL 复制逻辑
if(MINGW)
# 查找 libgcc DLL
execute_process(
COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libgcc_s_seh-1.dll
OUTPUT_VARIABLE GCC_DLL_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# 查找 libstdc++ DLL
execute_process(
COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libstdc++-6.dll
OUTPUT_VARIABLE STDCPP_DLL_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# 复制编译器运行时库
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${GCC_DLL_PATH}
$<TARGET_FILE_DIR:${PROJECT_NAME}>
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${STDCPP_DLL_PATH}
$<TARGET_FILE_DIR:${PROJECT_NAME}>
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<TARGET_FILE:SDL3_image::SDL3_image>
$<TARGET_FILE_DIR:${PROJECT_NAME}>
COMMENT "Copying MinGW runtime DLLs"
)
# ... (保持 MinGW DLL 复制逻辑)
endif()
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
@@ -122,10 +95,27 @@ if (WIN32)
COMMENT "Copying SDL3 runtime DLLs"
)
else() # Linux/macOS 等 Unix-like 系统
target_compile_definitions(${PROJECT_NAME} PRIVATE
ASIO_STANDALONE
)
target_link_libraries(${PROJECT_NAME}
PRIVATE
SDL3::SDL3
SDL3_ttf::SDL3_ttf
SDL3_image::SDL3_image
nlohmann_json::nlohmann_json
pthread # Linux 需要 pthread
${CMAKE_DL_LIBS} # 动态链接库
)
# 可选:添加额外的 Linux 特定链接库
find_package(Threads REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE Threads::Threads)
endif()
# ========== 仅复制修改过的 assets ==========
# ========== 跨平台资产复制 ==========
set(ASSETS_SRC_DIR "${CMAKE_SOURCE_DIR}/assets")
set(ASSETS_DST_DIR "$<TARGET_FILE_DIR:${PROJECT_NAME}>/assets")
@@ -149,4 +139,3 @@ foreach(ASSET_FILE ${ASSET_FILES})
COMMENT "Copying changed asset: ${REL_PATH}"
)
endforeach()
endif()