Я пытаюсь связать расширение 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, возможно ли, что компиляция в статическую библиотеку — ошибка?
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
вернуть состояние Луа.
Других решений пока нет …