привязка lua в статической библиотеке segfault

Я пытаюсь связать расширение 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;
}

Makefile:

CC=g++
CFLAGS=-c -Wall -fpermissive
LFLAGS=-lluaall: 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 в lua_gettop () из /usr/lib/liblua.so.5.1

У меня никогда не было проблем с lua, возможно ли, что компиляция в статическую библиотеку — ошибка?

0

Решение

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

Это основная проблема C здесь. Вы невозможно изменить значение параметров в Си, когда они передаются по значению.

startLua устанавливает значение своего параметра. Но это не влияет L совсем. Это не C ++ (и даже если бы это было так, вы не прошли мимо ссылка). Если вы хотите повлиять L, то вы должны передать указатель на L сам. Как в &L, а также startLua должен взять lua_State**, И чтобы установить значение, он должен разыменовать указатель (*start = lua_open()).

Или даже лучше, просто сделайте это:

lua_State *L = startLua();

И имеют startLua вернуть состояние Луа.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector