cmake_minimum_required(VERSION 3.12) set(CMAKE_CXX_STANDARD 17) project(LuaCJAPILib) list(APPEND EXTRA_LIBS dl) 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) 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} )