mirror of
https://gitcode.com/JianFeeeee/LuaCangjia_api.git
synced 2026-09-20 00:48:47 +00:00
- lib/lua 替换为完整 LuaJIT 2.1 仓库(Makefile+src+dynasm, 官方结构)
- 构建系统改造: lib/lua/CMakeLists.txt 改为调用 LuaJIT 自带 make
(BUILDMODE=static CFLAGS=-fPIC) 产出 libluajit.a; 顶层链接该静态库
并加 -Wl,-E 导出符号(静态链 LuaJIT 必需)
- 补充 lua.hpp 转发头兼容桥接层 'lua/lua.hpp' include 路径
- 桥接层沿用 5.1 方案: Registry 存 iopath / luaL_tolstring 兜底 /
typed interop 无 integer 子类型(LUA_VERSION_NUM=501)
- [关键修复] lua_remove 栈越界 bug(各版本共有, LuaJIT 下显性崩溃):
* unload_lib: ref 记录的是 gettop+1, 实际移除应用 ref-1
* clean(): 原逐个 remove 循环恒越界且多次移除后索引偏移,
属死代码(末尾 settop(L,0) 已清栈), 直接删除
该 bug 在 Lua 5.4 中被隐式容忍, 在 LuaJIT 的 GC finalizer 中
表现为 lj_gc_finalize_cdata 段错误
- 测试跨版本断言同步(自 5.1.5)
- 验证: GTest 44/44 通过
68 lines
1.9 KiB
CMake
68 lines
1.9 KiB
CMake
cmake_minimum_required(VERSION 3.12)
|
|
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)
|
|
|
|
if(TARGET_WINDOWS)
|
|
# Windows 平台配置
|
|
list(APPEND EXTRA_LIBS "")
|
|
else()
|
|
# Linux/macOS 配置
|
|
list(APPEND EXTRA_LIBS dl)
|
|
endif()
|
|
|
|
set(ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
|
|
|
|
include_directories(${ROOT_PATH} ${ROOT_PATH}/lua ${ROOT_PATH}/lua/src)
|
|
add_subdirectory(lua)
|
|
|
|
# LuaJIT 子目录通过 PARENT_SCOPE 变量暴露头文件与静态库路径
|
|
if(LUAJIT_INCLUDE_DIR)
|
|
include_directories(${LUAJIT_INCLUDE_DIR})
|
|
endif()
|
|
|
|
# 方案:使用 OBJECT 库
|
|
add_library(luarunner OBJECT lua_runner.cpp)
|
|
target_include_directories(luarunner PRIVATE ${ROOT_PATH}/lua/src)
|
|
|
|
# Windows 特定编译定义
|
|
if(TARGET_WINDOWS)
|
|
target_compile_definitions(luarunner PRIVATE LUA_USE_WINDOWS)
|
|
endif()
|
|
|
|
add_library(luacjapi SHARED lua_cj_api.cpp)
|
|
add_dependencies(luacjapi lua) # 确保 LuaJIT 静态库先构建
|
|
|
|
# 链接阶段 - 根据平台选择不同的链接选项
|
|
if(TARGET_WINDOWS)
|
|
# Windows: 使用 Windows 兼容的链接选项
|
|
target_link_libraries(luacjapi PRIVATE
|
|
luarunner
|
|
"-Wl,--whole-archive"
|
|
lua
|
|
"-Wl,--no-whole-archive"
|
|
m
|
|
)
|
|
else()
|
|
# Linux/macOS: 使用 Unix 链接选项
|
|
# LuaJIT: 静态库路径由 lib/lua/CMakeLists.txt 的自定义目标产出
|
|
set(LUAJIT_LIB_PATH ${ROOT_PATH}/lua/src/libluajit.a)
|
|
if(LUAJIT_STATIC_LIB)
|
|
set(LUAJIT_LIB_PATH ${LUAJIT_STATIC_LIB})
|
|
endif()
|
|
target_link_libraries(luacjapi PRIVATE
|
|
luarunner
|
|
${LUAJIT_LIB_PATH} # LuaJIT 静态库(替代原 liblua.a)
|
|
m
|
|
${EXTRA_LIBS}
|
|
)
|
|
# 静态链接 LuaJIT 必须导出符号(-Wl,-E), 否则 lua_yield 等报错
|
|
target_link_options(luacjapi PRIVATE -Wl,-E)
|
|
endif()
|