【问题标题】:Compiling a dynamic library on mac os x linking against lib lua results in "lua: multiple Lua VMs detected"在 mac os x 上编译动态库链接 lib lua 会导致“lua:检测到多个 Lua VM”
【发布时间】:2015-04-04 00:50:05
【问题描述】:

我正在尝试在 macosx 上创建可用作 lua 扩展的动态库。

这是我的生成文件:

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)

我正在使用 Luiz Henrique 在他的page 上推荐的建议标志。

尽管如此,我仍然看到错误:

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”和“-E”的帖子,但我都试过了,但都没有运气。

编辑:我正在尝试像这样在 lua 中使用这个共享库:

#!/usr/bin/env lua
-- for osx
package.cpath = package.cpath .. ";?.dylib"
local signal = require "lsignal"
print(signal.SIGABRT)

【问题讨论】:

  • lua 模块不应链接到 lua 本身。宿主应用程序应该有 lua 链接。
  • 应删除哪些标志以在 lua 脚本中使用它?
  • -llua 标志正在链接到 lua 库。

标签: c++ macos lua makefile


【解决方案1】:

正如 Etan 所说,您不需要将 Lua 解释器与库本身链接;从您的 LUA_LIB 行中删除 -llua。例如,这是我在 OSX 上构建 luasocket 库时使用的命令:

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

【讨论】:

  • 我添加了该行,因为我之前使用的是“premake4”,它不会让我按照我想要的方式命名共享库。我切换到了通用的 makefile,因为它具有更可预测的行为。
猜你喜欢
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多