0

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

ユーティリティ.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 is defined but not used」または「L is used uninitialized」です。

実行時に、すぐにセグメンテーション違反が発生します。

私はライブラリを頻繁に使用するわけではないので、そこに問題がある可能性があります。その場合、これは簡単な質問です。

必要に応じて、gcc 4.7.2、lua 5.1.5、および Arch Linux (更新済み) を使用します。

編集: GDB によると、問題はここにあります: プログラムが信号 SIGSEGV を受信しました。セグメンテーション違反です。/usr/lib/liblua.so.5.1 からの lua_gettop () の 0x00007ffff7bb6390

lua で問題が発生したことはありませんが、静的ライブラリにコンパイルするのが間違いである可能性はありますか?

4

1 に答える 1

2
lua_State* L;
startLua(L);//after the call to this is gets the segfault

これは基本的な C の問題です。値渡しの場合、C のパラメーターの値を変更することはできません

startLuaパラメータの値を設定します。しかし、それはまったく影響しませんLこれは C++ ではありません (C++ であったとしても、参照渡ししていません)。に影響を与えたい場合はL、それ自体へのポインターを渡す必要がありますL。のように&LstartLuaを取る必要がありlua_State**ます。また、値を設定するには、ポインターを逆参照する必要があります ( *start = lua_open())。

またはさらに良いことに、これを行うだけです:

lua_State *L = startLua();

そして、Lua の状態をstartLua 戻します。

于 2012-11-15T17:24:24.010 に答える