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 通过
58 lines
2.1 KiB
CMake
58 lines
2.1 KiB
CMake
cmake_minimum_required(VERSION 3.14)
|
||
project(LuaCjApiTest)
|
||
|
||
set(CMAKE_CXX_STANDARD 17)
|
||
|
||
set(SCRIPT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/scripts" CACHE PATH "Path to Lua test scripts")
|
||
add_compile_definitions(SCRIPT_DIR="${SCRIPT_DIR}")
|
||
|
||
# ==================== 核心修改 ====================
|
||
# 1. 使用 add_subdirectory 直接包含 lib 源码目录
|
||
# 这会自动继承 lib 中定义的 luacjapi 目标及其依赖路径
|
||
# 无需手动检查文件是否存在,CMake 会处理整个依赖链
|
||
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../lib ${CMAKE_BINARY_DIR}/lib_build)
|
||
|
||
# ==================== 引入 Google Test ====================
|
||
# 优先使用本地源(网络受限环境): 环境变量 GTEST_LOCAL_DIR 或 /tmp/deps/googletest-1.14.0
|
||
if(DEFINED ENV{GTEST_LOCAL_DIR} AND EXISTS $ENV{GTEST_LOCAL_DIR})
|
||
set(FETCHCONTENT_SOURCE_DIR_GOOGLETEST $ENV{GTEST_LOCAL_DIR})
|
||
elseif(EXISTS /tmp/deps/googletest-1.14.0)
|
||
set(FETCHCONTENT_SOURCE_DIR_GOOGLETEST /tmp/deps/googletest-1.14.0)
|
||
endif()
|
||
include(FetchContent)
|
||
FetchContent_Declare(
|
||
googletest
|
||
GIT_REPOSITORY https://github.com/google/googletest.git
|
||
GIT_TAG v1.14.0
|
||
GIT_SHALLOW ON
|
||
)
|
||
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
|
||
FetchContent_MakeAvailable(googletest)
|
||
|
||
# ==================== 配置测试目标 ====================
|
||
add_executable(test_lua_cj_api test_lua_cj_api.cpp)
|
||
|
||
# 2. 包含头文件路径
|
||
# 注意:由于 lib 项目使用的是旧式 include_directories,这里需要显式添加
|
||
# 或者更好的做法是修改 lib/CMakeLists.txt 使用 target_include_directories
|
||
target_include_directories(test_lua_cj_api PRIVATE
|
||
${CMAKE_CURRENT_SOURCE_DIR}/../lib
|
||
${CMAKE_CURRENT_SOURCE_DIR}/../lib/lua
|
||
)
|
||
|
||
# 3. 链接库
|
||
# 直接链接 lib 项目导出的 luacjapi 目标。
|
||
# CMake 会自动处理 RPATH、库搜索路径和传递依赖(如 lua、m 等)
|
||
target_link_libraries(test_lua_cj_api PRIVATE
|
||
luacjapi # 来自 lib 项目
|
||
GTest::gtest_main
|
||
pthread
|
||
dl
|
||
m
|
||
)
|
||
|
||
# ==================== 注册测试 ====================
|
||
enable_testing()
|
||
include(GoogleTest)
|
||
gtest_discover_tests(test_lua_cj_api)
|