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()