使用LuaRocks链接C++测试至Lua的变量传递与跨平台问题
解决方案
问题1:luarocks test阶段无法获取Lua相关构建变量
luarocks test默认不会自动传递build_variables中的参数,需要在rockspec的test字段显式传递这些变量给Makefile,实现测试代码的独立编译:
修改rockspec,添加test配置:
test = { commands = { "make test LUA_DIR=$(LUA_DIR) LUA_INCDIR=$(LUA_INCDIR) LUA_LIBDIR=$(LUA_LIBDIR) LUA_LIB=$(LUA_LIB)" }, dependencies = { "busted" } -- 若依赖Busted测试框架,需声明 }
同时在Makefile中新增独立的test目标,专门处理doctest的C++测试编译:
test: test_binary ./test_binary # 若有Busted测试,可追加执行:busted spec/ test_binary: test_source.cpp your_library.o $(CXX) $(CPPFLAGS) -I$(LUA_INCDIR) $^ -o $@ $(LDFLAGS) $(LINK_TO_LUA_FLAGS)
问题2:跨平台兼容Lua/LuaJIT的链接问题
Mac系统链接器不支持-l:语法,可通过以下两种方案解决:
方案1:利用LuaRocks原生变量LUA_LIB
LuaRocks提供的LUA_LIB变量已适配Lua/LuaJIT的链接规则(原生Lua对应-llua,LuaJIT对应-lluajit-5.1),直接在rockspec和Makefile中使用即可:
- 在rockspec的
build_variables中添加该变量:
build_variables = { -- ... 其他原有变量 LUA_LIB = "$(LUA_LIB)", }
- 在Makefile中直接引用:
LINK_TO_LUA_FLAGS := -L$(LUA_LIBDIR) $(LUA_LIB)
方案2:兼容旧版LuaRocks的fallback写法
若你的LuaRocks版本未提供LUA_LIB,可通过Lua解释器检测是否为LuaJIT,动态生成链接参数:
# 检测当前Lua环境是否为LuaJIT IS_LUAJIT := $(shell $(LUA) -e 'print(jit and jit.version or nil)' 2>/dev/null) ifeq ($(IS_LUAJIT),) # 原生Lua链接规则 LINK_TO_LUA_FLAGS := -L$(or $(LUA_LIBDIR),$(LUA_DIR)/lib) -llua else # LuaJIT链接规则 LINK_TO_LUA_FLAGS := -L$(or $(LUA_LIBDIR),$(LUA_DIR)/lib) -lluajit-5.1 endif
最终整合后的rockspec片段
build = { type = "make", variables = { LIB_EXTENSION = "$(LIB_EXTENSION)", LUA = "$(LUA)", LUAROCKS = "$(SCRIPTS_DIR)/luarocks", OBJ_EXTENSION = "$(OBJ_EXTENSION)", }, build_variables = { LIBFLAG = "$(LIBFLAG)", LUA_DIR = "$(LUA_DIR)", LUA_INCDIR="$(LUA_INCDIR)", LUA_LIBDIR = "$(LUA_LIBDIR)", LUA_LIB = "$(LUA_LIB)", }, install_variables = { INST_LIBDIR = "$(LIBDIR)", }, } test = { commands = { "make test LUA_DIR=$(LUA_DIR) LUA_INCDIR=$(LUA_INCDIR) LUA_LIBDIR=$(LUA_LIBDIR) LUA_LIB=$(LUA_LIB)", "busted spec/" -- 若有Busted测试,追加此命令 }, dependencies = { "busted" } }
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

