2015-04-03 84 views
1

我正在嘗試在macosx上創建可用作lua擴展的動態庫。在mac os上編譯一個動態庫x鏈接到lib lua導致「lua:檢測到多個Lua VMs」

這裏是我的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) 

我使用他的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) 
+1

lua模塊不應該鏈接lua自己。宿主應用程序應該有lua鏈接。 – 2015-04-03 16:37:47

+0

應該刪除哪些標記以在lua腳本中使用它? – ChristianB 2015-04-03 16:43:20

+2

「-llua」標誌鏈接到lua庫。 – 2015-04-03 16:45:36

回答

2

正如伊坦說,你不需要到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

+0

我添加了該行,因爲我之前使用的是「premake4」,它不會讓我以我想要的方式命名共享庫。我切換到一個通用的生成文件,因爲它具有更多可預測的行爲。 – ChristianB 2015-04-03 20:35:40