修复windows平台编译问题

This commit is contained in:
2026-03-25 16:23:54 +08:00
parent 905d70809b
commit 135e04760a
2 changed files with 122 additions and 98 deletions

View File

@ -1,36 +1,56 @@
cmake_minimum_required(VERSION 3.12) cmake_minimum_required(VERSION 3.12)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
# 检测目标平台 - 通过编译器名称检测
set(TARGET_WINDOWS FALSE)
if(CMAKE_C_COMPILER MATCHES "mingw" OR CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(TARGET_WINDOWS TRUE)
endif()
project(LuaCJAPILib) project(LuaCJAPILib)
list(APPEND EXTRA_LIBS dl) if(TARGET_WINDOWS)
# Windows 平台配置
list(APPEND EXTRA_LIBS "")
else()
# Linux/macOS 配置
list(APPEND EXTRA_LIBS dl)
endif()
set(ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) set(ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${ROOT_PATH} ${ROOT_PATH}/lua) include_directories(${ROOT_PATH} ${ROOT_PATH}/lua)
add_subdirectory(lua) add_subdirectory(lua)
# ==================== 核心修改 ====================
# 方案:使用 OBJECT 库 # 方案:使用 OBJECT 库
# 1. OBJECT 库不会生成 .a 文件,而是生成中间对象文件 (.o)。
# 2. 当 luacjapi (SHARED) 引用 luarunner (OBJECT) 时CMake 会自动开启 -fPIC 编译选项。
# 3. 这解决了 luarunner 缺少 PIC 导致的运行时崩溃问题。
add_library(luarunner OBJECT lua_runner.cpp) add_library(luarunner OBJECT lua_runner.cpp)
# 显式声明依赖,虽然 OBJECT 库不链接,但这建立了依赖关系
target_include_directories(luarunner PRIVATE ${ROOT_PATH}/lua) target_include_directories(luarunner PRIVATE ${ROOT_PATH}/lua)
# Windows 特定编译定义
if(TARGET_WINDOWS)
target_compile_definitions(luarunner PRIVATE LUA_USE_WINDOWS)
endif()
add_library(luacjapi SHARED lua_cj_api.cpp) add_library(luacjapi SHARED lua_cj_api.cpp)
# 链接阶段 # 链接阶段 - 根据平台选择不同的链接选项
# 1. luarunner (OBJECT): 代码直接嵌入 luacjapi.so if(TARGET_WINDOWS)
# 2. lua (STATIC): 必须用 -Wl,--whole-archive 包裹。 # Windows: 使用 Windows 兼容的链接选项
# 原因:lua_cj_api.cpp 只调用了少数 Lua 函数,如果不强制全链接, target_link_libraries(luacjapi PRIVATE
# 链接器会丢弃 print, io 等标准库函数,导致 Lua 运行时功能缺失。 luarunner
target_link_libraries(luacjapi PRIVATE "-Wl,--whole-archive"
luarunner lua
"-Wl,--whole-archive" "-Wl,--no-whole-archive"
lua m
"-Wl,--no-whole-archive" )
m else()
${EXTRA_LIBS} # Linux/macOS: 使用 Unix 链接选项
) target_link_libraries(luacjapi PRIVATE
luarunner
"-Wl,--whole-archive"
lua
"-Wl,--no-whole-archive"
m
${EXTRA_LIBS}
)
endif()

View File

@ -1,77 +1,81 @@
cmake_minimum_required(VERSION 3.12) cmake_minimum_required(VERSION 3.12)
project(lua VERSION 5.4.6 LANGUAGES C) project(lua VERSION 5.4.6 LANGUAGES C)
set(CMAKE_SYSTEM_NAME Linux) # 基础配置
# 基础配置 set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD 99) # 使用 C99 标准 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -Wall -Wextra")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -Wall -Wextra") set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# 平台检测 # 检测目标系统 - 通过编译器名称检测
if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(IS_WINDOWS FALSE)
message(STATUS "Configuring for Linux/HarmonyOS") if(CMAKE_C_COMPILER MATCHES "mingw" OR CMAKE_SYSTEM_NAME STREQUAL "Windows")
add_compile_definitions(LUA_USE_LINUX LUA_COMPAT_5_3) set(IS_WINDOWS TRUE)
endif()
# 鸿蒙系统可能不支持 readline因此不包含相关配置
# 如果鸿蒙系统有其他支持的库,可以在这里添加 # 根据目标系统配置
if(IS_WINDOWS)
# 添加动态链接支持 message(STATUS "Configuring for Windows/MinGW")
list(APPEND EXTRA_LIBS dl) add_compile_definitions(LUA_USE_WINDOWS LUA_COMPAT_5_3)
list(APPEND EXTRA_LIBS "")
else() # 通用 Unix 配置 elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
message(STATUS "Configuring for generic Unix") message(STATUS "Configuring for Linux/HarmonyOS")
add_compile_definitions(LUA_USE_POSIX LUA_COMPAT_5_3) add_compile_definitions(LUA_USE_LINUX LUA_COMPAT_5_3)
list(APPEND EXTRA_LIBS dl) list(APPEND EXTRA_LIBS dl)
endif() else()
message(STATUS "Configuring for generic Unix")
# Lua 核心文件列表 add_compile_definitions(LUA_USE_POSIX LUA_COMPAT_5_3)
file(GLOB LUA_CORE_SOURCES list(APPEND EXTRA_LIBS dl)
lapi.c endif()
lcode.c
lctype.c # Lua 核心文件列表
ldebug.c file(GLOB LUA_CORE_SOURCES
ldo.c lapi.c
ldump.c lcode.c
lfunc.c lctype.c
lgc.c ldebug.c
llex.c ldo.c
lmem.c ldump.c
lobject.c lfunc.c
lopcodes.c lgc.c
lparser.c llex.c
lstate.c lmem.c
lstring.c lobject.c
ltable.c lopcodes.c
ltm.c lparser.c
lundump.c lstate.c
lvm.c lstring.c
lzio.c ltable.c
) ltm.c
lundump.c
# Lua 库文件列表 lvm.c
file(GLOB LUA_LIB_SOURCES lzio.c
lauxlib.c )
lbaselib.c
lcorolib.c # Lua 库文件列表
ldblib.c file(GLOB LUA_LIB_SOURCES
liolib.c lauxlib.c
lmathlib.c lbaselib.c
loadlib.c lcorolib.c
loslib.c ldblib.c
lstrlib.c liolib.c
ltablib.c lmathlib.c
lutf8lib.c loadlib.c
linit.c loslib.c
) lstrlib.c
ltablib.c
# 特殊源文件的编译器优化 lutf8lib.c
set_source_files_properties( linit.c
llex.c )
lparser.c
lcode.c # 特殊源文件的编译器优化
PROPERTIES COMPILE_FLAGS "-Os" set_source_files_properties(
) llex.c
lparser.c
add_library(lua STATIC lcode.c
${LUA_CORE_SOURCES} PROPERTIES COMPILE_FLAGS "-Os"
${LUA_LIB_SOURCES} )
)
add_library(lua STATIC
${LUA_CORE_SOURCES}
${LUA_LIB_SOURCES}
)