【问题标题】:binding lua in static library segfault在静态库段错误中绑定 lua
【发布时间】: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 通过调试器运行它,出错的地方很奇怪。

标签: c++ lua


【解决方案1】:
lua_State* L;
startLua(L);//after the call to this is gets the segfault

这是一个基本的 C 问题。在 C 中按值传递参数时,您无法更改参数的值。

startLua 设置其参数的值。但这根本不影响L。这不是 C++(即使是,您也没有通过 reference 传递它)。如果你想影响L,那么你必须传递一个指向L 本身的指针。如&amp;LstartLua 必须采用lua_State**。并且要设置值,它必须取消引用指针 (*start = lua_open())。

或者更好,只需这样做:

lua_State *L = startLua();

并让startLua 返回 Lua 状态。

【讨论】:

  • 感谢您的信息。这应该是一个更大的库,可以操作一个指针数组,不得不问,指向指针的指针在技术上是否合法?
  • @Shingetsu:“是指向技术上合法的指针的指针”如果你愿意,你可以拥有ObjectType************。现在,当你声称使用 C++ 时,为什么你需要“指向指针的指针”是我无法理解的。你知道std::vector之类的东西,对吧?
  • 是的,我知道,我只是更喜欢 C 方式。我只是碰巧在使用 C++ 库,我只是尽可能地遵守 C 约定。
猜你喜欢
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2017-11-06
  • 2014-05-10
  • 1970-01-01
相关资源
最近更新 更多