C++ 静态库segfault中绑定lua
我试图把C++(功能)LUA扩展绑定为静态库到主机C++程序。 我做了一个极简方案,看看它是否能正常工作。我目前有以下代码: main.cpp: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
#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();