在静态库segfault中绑定lua
binding lua in static library segfault
我正在尝试将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状态。
相关文章:
- 使用 C++ 自动 Lua 绑定
- 如何使 SWIG 绑定类在 Lua 中使用运算符?
- 在静态库segfault中绑定lua
- 无法将Boost.Any对象传递到C++Lua绑定
- 对象与静态成员的lua/C++绑定
- Lua/C++从头开始绑定
- Lua C++类绑定垃圾回收关闭
- 在lua中,有没有办法将upvalue绑定到userdata值而不是函数
- 如何将C++函数绑定到lua,该函数使用luabind返回多个值
- 我可以将我的c++代码绑定到lua并将其开发到某个lua游戏引擎吗
- 当我调用绑定的 c++ 类函数两次时出现 lua 错误?
- 如何使用LuaBind将std::map绑定到Lua
- 试图将函数绑定到lua的c++错误
- lua绑定的单例类在析构函数中崩溃
- 向绑定到Lua的c++类添加成员函数
- 如何在c++中不绑定lua的情况下将成员函数注册到lua
- 在使用Luajit时,是使用FFI还是普通lua绑定更好?
- LuaBind:如何将类的特定实例绑定到Lua
- 当Lua被绑定到类中时,使用LuaBind在类中调用Lua函数
- 如何将c++成员方法和成员变量与Lua C API绑定