【发布时间】:2012-11-15 15:27:00
【问题描述】:
我正在尝试将 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;
}
生成文件:
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,分段错误。 0x00007ffff7bb6390 in lua_gettop() from /usr/lib/liblua.so.5.1
我从来没有遇到过lua问题,会不会编译成静态库是个错误?
【问题讨论】:
-
问题是,
start = lua_open();是否让start被初始化?它甚至能走到那一步吗? -
@TonyTheLion 在每个操作之前添加了 std::cout 调用,并在此处的代码中添加注释以了解它的位置。
-
@TonyTheLion 通过调试器运行它,出错的地方很奇怪。