在 Mac OS X 上编译针对 lib lua 链接的动态库会导致"lua: multiple Lua VMs detected"
Compiling a dynamic library on mac os x linking against lib lua results in "lua: multiple Lua VMs detected"
我正试图在macosx上创建可以用作lua扩展的动态库。
这是我的makefile:
SOURCES= src/lsignal.cpp
OBJ= lsignal.o
CC= clang++
LUA_PATH= third_party/lua-5.2.3/src
LUA_INCLUDE= -I include -I $(LUA_PATH)
LUA_LIB= -L $(LUA_PATH) -llua
# linux
CFLAGS_LINUX= -fPIC
# macosx
CFLAGS_MACOSX=
# linux
LFLAGS_LINUX= -shared
# macosx
LFLAGS_MACOSX= -bundle -undefined dynamic_lookup
# target
TARGET= lsignal.so
# placeholder
CFLAGS= -Wall -I include -I $(LUA_PATH) -c
LFLAGS= $(LUA_LIB)
# ho-lee-sheet they have if statements and os checks
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Darwin)
CFLAGS+=$(CFLAGS_MACOSX)
LFLAGS+=$(LFLAGS_MACOSX)
else
CFLAGS+=$(CFLAGS_LINUX)
LFLAGS+=$(LFLAGS_LINUX)
endif
.PHONY: debug
debug: CFLAGS+=-DDEBUG
debug: all
.PHONY: release
release: CFLAGS+=-O2
release: all
all: lsignal
@echo "LFLAGS: $(LFLAGS)"
$(CC) $(LFLAGS) -o $(TARGET) $(OBJ)
lsignal:
@echo "CFLAGS: $(CFLAGS)"
$(CC) $(CFLAGS) $(SOURCES)
clean:
rm -f $(OBJ) $(TARGET)
我正在使用路易斯·恩里克在他的页面上推荐的旗帜。
尽管如此,我仍然看到错误:
lua: multiple Lua VMs detected
stack traceback:
[C]: in ?
[C]: in function 'require'
test.lua:4: in main chunk
[C]: in ?
lua(52879,0x7fff746ad300) malloc: *** error for object 0x10aa02938: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
zsh: abort lua test.lua
我是否缺少链接某个位置的标志?我看到了一篇关于"-Wl"answers"-E"的帖子,但我都试过了,但没有运气。
编辑:我正试图在lua中使用这个共享库,如下所示:
#!/usr/bin/env lua
-- for osx
package.cpath = package.cpath .. ";?.dylib"
local signal = require "lsignal"
print(signal.SIGABRT)
正如Etan所说,您不需要将Lua解释器与库本身链接;从LUA_LIB行中删除-llua
。例如,这是我用来在OSX:上构建lusocket库的命令
BUILD_FLAGS="-O2 -dynamiclib -undefined dynamic_lookup -I $INSTALL_DIR/include -L $INSTALL_DIR/lib"
gcc $BUILD_FLAGS -o "$INSTALL_DIR/lib/lua/$LUAV/socket/core.dylib"
src/{auxiliar.c,buffer.c,except.c,inet.c,io.c,luasocket.c,options.c,select.c,tcp.c,timeout.c,udp.c,usocket.c}
[根据您的编辑更新]:您的目标是lsignal.so
,但您正在尝试从.dylib
文件加载。package.cpath
需要引用?.so
,或者需要将目标重命名为lsignal.dylib
。
相关文章:
- C++Lua用户数据扰乱了Mathfu浮点值
- 使用 LuaBridge 或 Lua 将对象传递给 Lua 函数C++
- 将 Lua 函数块转换为 C 字符串
- 我可以从 lua 5.0.2 加载用 c++ 编写的 lua 5.3.5 dll 吗?
- 使用 lua 协程 API 和lua_close时出现分段错误
- 使用 C++ 自动 Lua 绑定
- 调用 lua 函数的地址为 C/C++?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- 如何将 Lua 添加到C++项目
- 使用 Lua 中的C++库对象
- 如何在C++中将用户数据从一个 Lua 块传递到另一个块
- 为什么此代码中显示"*** stack smashing detected ***: <unknown> terminated Aborted (core dumped) "错误?
- 如何使用重新定义的打印函数打印Lua表?
- Lua table in C++ dll
- 在运行时环境中使用 C++ w/ Lua
- 将shared_ptr传递给Lua
- luaL_len is missing in Lua 5.1
- 将向量传递给<struct> Lua 表
- 将 Lua 与 C++ DLL 结合使用
- 在 Mac OS X 上编译针对 lib lua 链接的动态库会导致"lua: multiple Lua VMs detected"