在静态库段错误中绑定lua

时间:2012-11-15 15:27:00

标签: c++ lua

我正在尝试将C ++(functional)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未使用未初始化”。

在运行时,它会立即给我一个段错误。

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

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

编辑:根据GDB,问题在于: 程序接收信号SIGSEGV,分段故障。 来自/usr/lib/liblua.so.5.1的lua_gettop()中的0x00007ffff7bb6390

我从未遇到过lua问题,是否有可能将其编译成静态库是错误的?

1 个答案:

答案 0 :(得分:2)

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状态。