静态库中绑定lua时出现了段错误。

我正在尝试将一个 C++(Functional)lua 扩展作为静态库绑定到主机 C++ 程序中。

我制作了一个简陋的程序来查看它是否能够正常工作。我目前有以下代码:

main.cpp:

#include "util.h"

int main()
{
    lua_State* L;
    startLua(L);//在调用此代码之后,它会得到 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)
{
    //程序没有到达这里
    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,问题出在这里: Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7bb6390 in lua_gettop () from /usr/lib/liblua.so.5.1

我从未遇到过与 lua 有关的问题,将其编译为静态库可能是一个错误吗?

点赞
用户734069
用户734069
lua_State* L;
startLua(L);//在调用此函数后会得到一个段错误(segfault)

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

startLua 设置其参数的值。但这根本不影响 L。这不是 C++(即使是,你也没有传递引用)。如果要影响 L,则必须传递对 L 本身的指针。例如 &L,并且 startLua 必须使用 lua_State**。为了设置值,它必须解除指针引用(*start = lua_open())。

或者更好的是,只需这样做:

lua_State *L = startLua();

startLua 返回 Lua 状态。

2012-11-15 17:24:24