c++ - 在静态库段错误中绑定(bind)lua

标签 c++ lua

我正在尝试将 C++(函数式)lua 扩展作为静态库绑定(bind)到主机 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");
}

工具.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

我还尝试从 header 中取消定义 L 并完全在 main() 内部定义它,结果相同。

我在编译期间收到的唯一警告是“L 已定义但未使用”或“L 未初始化使用”。

在运行时,它会立即给我一个段错误。

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

以防万一,我使用 gcc 4.7.2、lua 5.1.5 和 Arch Linux(已更新)。

编辑:根据 GDB,问题出在这里: 程序收到信号 SIGSEGV,段错误。 lua_gettop () 中的 0x00007ffff7bb6390 来自/usr/lib/liblua.so.5.1

我从来没有遇到过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++ - 在静态库段错误中绑定(bind)lua,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13400660/

相关文章:

c++ - C++11 中的线程 ID 行为

c++ - 删除后缀的正则表达式

c++ - 如何用visual studio 2008打开vcxproj(visual c++项目)

algorithm - 查找多边形内的任意点

c++ - 比较指针和空字符是否合法?

lua - 在 Lua 中,处理包含 nil 的可变参数的正确方法是什么?

c++ - 为返回对 vector 的函数创建 SWIG 类型映射

lua - 在 Torch 中添加自定义损失函数

c++ - 嵌入式 Lua - 超时流氓脚本(例如无限循环) - 一个例子吗?

c++ - static const 成员初始化中的 sizeof