在静态库segfault中绑定lua

binding lua in static library segfault

本文关键字:绑定 lua segfault 静态      更新时间:2023-10-16

我正在尝试将C++(函数)lua扩展作为静态库绑定到主机C++程序
我做了一个极简主义程序,看看它是否能正常工作。我现在有这个代码:

main.cpp:

#include "util.h"
int main()
{
lua_State* L;
startLua(L);//after the call to this is gets the segfault
luaL_dofile(L,"test.lua");
}

util.h:

#ifndef _UTIL_FILE_INCLUDED_
#define _UTIL_FILE_INCLUDED_
extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}

//functions
int startLua(lua_State* start);
#endif

util.cpp:

#include "util.h"
int startLua(lua_State* start)
{
//program never gets here
start = lua_open();
luaL_openlibs(start);
return 0;
}

Makefile:

CC=g++
CFLAGS=-c -Wall -fpermissive 
LFLAGS=-llua

all: util.a main.o 
$(CC) $(LFLAGS) main.o util.a -o main
util.a: util.o util.h
ar -cvq util.a util.o
util.o: util.cpp util.h
$(CC) $(CFLAGS) util.cpp
main.o: main.cpp util.h
$(CC) $(CFLAGS) main.cpp
clean:
rm *.o *.a

我还尝试从标题中取消L的定义,并将其完全定义在main()中,得到了相同的结果。

我在编译过程中得到的唯一警告是"L已定义但未使用"或"L未初始化时使用"。

在运行时,它会立即给我一个segfault。

我并不经常使用库,所以这可能是一个错误,在这种情况下,这应该是一个简单的问题。

如果重要的话,我会使用gcc 4.7.2、lua 5.1.5和Arch Linux(更新版)。

编辑:根据GDB的说法,问题就在这里:程序接收到信号SIGSEGV,分段故障。0x00007ffff7bb6390在/usr/lib/liblua.so.5.1 中的lua_gettiop()中

我从来没有遇到过lua的问题,把它编译成静态库可能是个错误吗?

lua_State* L;
startLua(L);//after the call to this is gets the segfault

这是一个基本的C问题。当参数按值传递时,您不能更改C中参数的值。

startLua设置其参数的值。但这根本不影响L。这不是C++(即使是,你也没有通过引用)。如果要影响L,则必须将指针传递给L本身。与&L一样,startLua必须采用lua_State**。并且要设置该值,它必须取消引用指针(*start = lua_open())。

或者更好的做法是:

lua_State *L = startLua();

并使startLua返回Lua状态。