gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:28:04 25 4
gpt4 key购买 nike

我正在尝试将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com