0

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

主.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");
}

实用程序.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

实用程序.cpp:

#include "util.h"

int startLua(lua_State* start)
{
    //program never gets here
    start = lua_open();
    luaL_openlibs(start);
    return 0;
}

生成文件:

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的问题,将它编译成静态库是否可能是一个错误?

4

1 回答 1

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

于 2012-11-15T17:24:24.010 回答