C++ 静态库segfault中绑定lua

C++ 静态库segfault中绑定lua,c++,lua,C++,Lua,我试图把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_INCL

我试图把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
生成文件:

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

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

如果有必要,我使用GCC4.7.2、Lua5.1.5和ArchLinux(更新版)

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

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

lua_State* L;
startLua(L);//after the call to this is gets the segfault
这是一个基本的C问题。通过值传递参数时,不能更改C中参数的值

STARTUA
设置其参数的值。但这根本不影响
L
。这不是C++(即使是,也没有引用)。如果要影响
L
,则必须传递指向
L
本身的指针。在
&L
中,和
startua
必须采取
lua\u状态**
。要设置该值,它必须取消对指针的引用(
*start=lua\u open()

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

lua_State *L = startLua();

startua
返回Lua状态。

问题是
start=Lua_open()吗获取
开始
?它真的有那么远吗?@TonyTheLion在每个操作之前都添加了std::cout调用,并在代码中添加了一条注释说明它的位置。@TonyTheLion通过调试器运行了它,出现错误的地方很奇怪。谢谢你提供的信息。这应该是一个更大的库,可以操作一系列指针,不得不问,指针指向指针的指针在技术上合法吗?@Shingetsu:“指针指向指针的指针在技术上合法吗”如果你愿意,你可以拥有
ObjectType************
。现在,当你声称使用C++时,你为什么需要“指向指针的指针”,这超出了我的能力。你知道像std::vector之类的东西,对吧?是的,我知道,我只是更喜欢C方式。我恰巧是在使用C++库,只要有可能,我就一直遵守C约定。
lua_State *L = startLua();