diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index be70b8f..0f4c773 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -1,36 +1,56 @@ 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) -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}) include_directories(${ROOT_PATH} ${ROOT_PATH}/lua) add_subdirectory(lua) -# ==================== 核心修改 ==================== - # 方案:使用 OBJECT 库 -# 1. OBJECT 库不会生成 .a 文件,而是生成中间对象文件 (.o)。 -# 2. 当 luacjapi (SHARED) 引用 luarunner (OBJECT) 时,CMake 会自动开启 -fPIC 编译选项。 -# 3. 这解决了 luarunner 缺少 PIC 导致的运行时崩溃问题。 add_library(luarunner OBJECT lua_runner.cpp) - -# 显式声明依赖,虽然 OBJECT 库不链接,但这建立了依赖关系 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) -# 链接阶段 -# 1. luarunner (OBJECT): 代码直接嵌入 luacjapi.so -# 2. lua (STATIC): 必须用 -Wl,--whole-archive 包裹。 -# 原因:lua_cj_api.cpp 只调用了少数 Lua 函数,如果不强制全链接, -# 链接器会丢弃 print, io 等标准库函数,导致 Lua 运行时功能缺失。 -target_link_libraries(luacjapi PRIVATE - luarunner - "-Wl,--whole-archive" - lua - "-Wl,--no-whole-archive" - m - ${EXTRA_LIBS} -) \ No newline at end of file +# 链接阶段 - 根据平台选择不同的链接选项 +if(TARGET_WINDOWS) + # Windows: 使用 Windows 兼容的链接选项 + target_link_libraries(luacjapi PRIVATE + luarunner + "-Wl,--whole-archive" + lua + "-Wl,--no-whole-archive" + m + ) +else() + # Linux/macOS: 使用 Unix 链接选项 + target_link_libraries(luacjapi PRIVATE + luarunner + "-Wl,--whole-archive" + lua + "-Wl,--no-whole-archive" + m + ${EXTRA_LIBS} + ) +endif() diff --git a/lib/lua/CMakeLists.txt b/lib/lua/CMakeLists.txt index 9bc096a..dfcada4 100755 --- a/lib/lua/CMakeLists.txt +++ b/lib/lua/CMakeLists.txt @@ -1,77 +1,81 @@ -cmake_minimum_required(VERSION 3.12) -project(lua VERSION 5.4.6 LANGUAGES C) - -set(CMAKE_SYSTEM_NAME Linux) -# 基础配置 -set(CMAKE_C_STANDARD 99) # 使用 C99 标准 -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -Wall -Wextra") -set(CMAKE_POSITION_INDEPENDENT_CODE ON) -# 平台检测 -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - message(STATUS "Configuring for Linux/HarmonyOS") - add_compile_definitions(LUA_USE_LINUX LUA_COMPAT_5_3) - - # 鸿蒙系统可能不支持 readline,因此不包含相关配置 - # 如果鸿蒙系统有其他支持的库,可以在这里添加 - - # 添加动态链接支持 - list(APPEND EXTRA_LIBS dl) - -else() # 通用 Unix 配置 - message(STATUS "Configuring for generic Unix") - add_compile_definitions(LUA_USE_POSIX LUA_COMPAT_5_3) - list(APPEND EXTRA_LIBS dl) -endif() - -# Lua 核心文件列表 -file(GLOB LUA_CORE_SOURCES - lapi.c - lcode.c - lctype.c - ldebug.c - ldo.c - ldump.c - lfunc.c - lgc.c - llex.c - lmem.c - lobject.c - lopcodes.c - lparser.c - lstate.c - lstring.c - ltable.c - ltm.c - lundump.c - lvm.c - lzio.c -) - -# Lua 库文件列表 -file(GLOB LUA_LIB_SOURCES - lauxlib.c - lbaselib.c - lcorolib.c - ldblib.c - liolib.c - lmathlib.c - loadlib.c - loslib.c - lstrlib.c - ltablib.c - lutf8lib.c - linit.c -) - -# 特殊源文件的编译器优化 -set_source_files_properties( - llex.c - lparser.c - lcode.c - PROPERTIES COMPILE_FLAGS "-Os" -) - -add_library(lua STATIC - ${LUA_CORE_SOURCES} - ${LUA_LIB_SOURCES} -) \ No newline at end of file +cmake_minimum_required(VERSION 3.12) +project(lua VERSION 5.4.6 LANGUAGES C) + +# 基础配置 +set(CMAKE_C_STANDARD 99) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -Wall -Wextra") +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +# 检测目标系统 - 通过编译器名称检测 +set(IS_WINDOWS FALSE) +if(CMAKE_C_COMPILER MATCHES "mingw" OR CMAKE_SYSTEM_NAME STREQUAL "Windows") + set(IS_WINDOWS TRUE) +endif() + +# 根据目标系统配置 +if(IS_WINDOWS) + message(STATUS "Configuring for Windows/MinGW") + add_compile_definitions(LUA_USE_WINDOWS LUA_COMPAT_5_3) + list(APPEND EXTRA_LIBS "") +elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") + message(STATUS "Configuring for Linux/HarmonyOS") + add_compile_definitions(LUA_USE_LINUX LUA_COMPAT_5_3) + list(APPEND EXTRA_LIBS dl) +else() + message(STATUS "Configuring for generic Unix") + add_compile_definitions(LUA_USE_POSIX LUA_COMPAT_5_3) + list(APPEND EXTRA_LIBS dl) +endif() + +# Lua 核心文件列表 +file(GLOB LUA_CORE_SOURCES + lapi.c + lcode.c + lctype.c + ldebug.c + ldo.c + ldump.c + lfunc.c + lgc.c + llex.c + lmem.c + lobject.c + lopcodes.c + lparser.c + lstate.c + lstring.c + ltable.c + ltm.c + lundump.c + lvm.c + lzio.c +) + +# Lua 库文件列表 +file(GLOB LUA_LIB_SOURCES + lauxlib.c + lbaselib.c + lcorolib.c + ldblib.c + liolib.c + lmathlib.c + loadlib.c + loslib.c + lstrlib.c + ltablib.c + lutf8lib.c + linit.c +) + +# 特殊源文件的编译器优化 +set_source_files_properties( + llex.c + lparser.c + lcode.c + PROPERTIES COMPILE_FLAGS "-Os" +) + +add_library(lua STATIC + ${LUA_CORE_SOURCES} + ${LUA_LIB_SOURCES} +)