mirror of
https://gitcode.com/JianFeeeee/LuaCangjia_api.git
synced 2026-09-20 08:58:13 +00:00
修复windows平台编译问题
This commit is contained in:
@ -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()
|
||||||
|
|||||||
@ -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}
|
||||||
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user