Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: edg3 от Апрель 15, 2011, 19:45



Название: Lua + QT
Отправлено: edg3 от Апрель 15, 2011, 19:45
Добрый день. Хотел бы узнать, как подключить к QT интерпритатор Lua.
зі. если кому интересно, стоит задача построить график по заданной формуле. Для построения графика использую Qwt, а чтобы не писать парсер, решил просто вызывать функцию Lua, где будет записана форуме по которой считать.


Название: Re: Lua + QT
Отправлено: BRE от Апрель 15, 2011, 20:37
Подключить lua можно также, как и любую другую библиотеку (почитай про qmake и команды pro-файлы).
Кстати в Qt есть свой скриптовый язык (почитай про QtScript)


Название: Re: Lua + QT
Отправлено: AleUri от Апрель 16, 2011, 07:32
в качестве парсера можно использовать http://muparser.sourceforge.net/


Название: Re: Lua + QT
Отправлено: edg3 от Апрель 19, 2011, 20:33
а, ктто уже пробовал вызывать функцию с Lua в QT? у меня никак не получаеться, может там особенный синтаксис?

luaL_openlibs(locLua);

 luaL_dofile(locLua, "function.lua");

 lua_getglobal(locLua, "function");

 lua_pushnumber(locLua, x);
lua_call(locLua, 1, 1);
 double res = lua_tonumber(locLua, -1);

 lua_close( locLua );

вот таким способом не получаеться(


Название: Re: Lua + QT
Отправлено: brankovic от Апрель 20, 2011, 00:20
lua_getglobal(locLua, "function");

так надо делать не от "function" а от имени глобальное переменной где функция лежит. function там ключевое слово. И там ещё есть lua_pcall, который возвращает ошибку читабельную, лучше его использовать, а не lua_call.


Название: Re: Lua + QT
Отправлено: edg3 от Апрель 20, 2011, 09:41
пробовал lua_getglobal(locLua, "myfunc");
не помогло(


Название: Re: Lua + QT
Отправлено: edg3 от Апрель 20, 2011, 23:37
Код
C++ (Qt)
#include <QtGui>
#include "QwtBeginner.h"
#include <QMenu.h>
#include "lua.h"
#include "luaconf.h"
#include "lualib.h"
#include "lauxlib.h"
int main(int argc, char *argv[])
{
 
   QApplication app(argc, argv);
   QwtBeginner *wnd = new QwtBeginner;
   int k=10;
   lua_State *L=lua_open();
   luaL_openlibs(L);
   luaL_dofile(L,"function.lua");
   lua_getglobal(L,"myfunc");
   lua_pushnumber(L,k);
   lua_call(L,1,1);
   double res=lua_tonumber(L,-1);
   lua_close(L);
   QMenuBar pmen(wnd);
   QMenu menu("&Application");
   menu.addAction("&close",&app,SLOT(quit()));
   pmen.addMenu(&menu);
   pmen.setVisible(true);
   wnd->show();
   return app.exec();
 
}
 

выдает ошибку:
Код:
release/main.o:main.cpp:(.text+0x4a): undefined reference to `luaL_newstate()'

release/main.o:main.cpp:(.text+0x54): undefined reference to `luaL_openlibs(lua_State*)'

release/main.o:main.cpp:(.text+0x64): undefined reference to `luaL_loadfile(lua_State*, char const*)'

release/main.o:main.cpp:(.text+0x88): undefined reference to `lua_pcall(lua_State*, int, int, int)'

release/main.o:main.cpp:(.text+0xa0): undefined reference to `lua_getfield(lua_State*, int, char const*)'

release/main.o:main.cpp:(.text+0xb8): undefined reference to `lua_pushnumber(lua_State*, double)'

release/main.o:main.cpp:(.text+0xd0): undefined reference to `lua_call(lua_State*, int, int)'

release/main.o:main.cpp:(.text+0xe0): undefined reference to `lua_tonumber(lua_State*, int)'

release/main.o:main.cpp:(.text+0xea): undefined reference to `lua_close(lua_State*)'

collect2: ld returned 1 exit status

mingw32-make[1]: *** [release\untitled.exe] Error 1

mingw32-make: *** [release] Error 2


Название: Re: Lua + QT
Отправлено: brankovic от Апрель 21, 2011, 01:01
выдает ошибку:

release/main.o:main.cpp:(.text+0x4a): undefined reference to `luaL_newstate()'
...
collect2: ld returned 1 exit status
mingw32-make[1]: *** [release\untitled.exe] Error 1
mingw32-make: *** [release] Error 2


просто библиотека не нашлась, библиотеку надо добавить в командную строку, например:

g++ main.cpp -llua5.1

а ещё лучше так:

g++ main.cpp -L"C:\путь\до\библиотеки\луа" -llua5.1


Название: Re: Lua + QT
Отправлено: edg3 от Апрель 21, 2011, 01:10
а где это в QT Creator прописывать?


Название: Re: Lua + QT
Отправлено: brankovic от Апрель 21, 2011, 09:00
а где это в QT Creator прописывать?

где-то в qmake (Edit: в смысле в .pro-файле, который креатор создал для проекта) прописать надо, типа такого:

LIBS += -L/path/to/lua -llua5.1

на винде путь только будет с C:\ наверное, попробуйте разное


Название: Re: Lua + QT
Отправлено: edg3 от Апрель 21, 2011, 22:52
а какой из этих файлов указывать в LIBS +=C:\luatest\src\
lua51.dll
lua51.lib ?


Название: Re: Lua + QT
Отправлено: brankovic от Апрель 21, 2011, 23:41
а какой из этих файлов указывать в LIBS +=C:\luatest\src\
lua51.dll
lua51.lib ?

если lua51.dll лежит в C:\lua\libs, то указывать надо:

LIBS += -L"C:\lua\libs" -llua51

, без расширений. C:\lua\libs это место, где лежит lua51.dll


Название: Re: Lua + QT
Отправлено: edg3 от Апрель 22, 2011, 00:10
все прописал, но опять же. все те же ошибки(


Название: Re: Lua + QT
Отправлено: brankovic от Апрель 22, 2011, 00:24
все прописал, но опять же. все те же ошибки(

C:\mingw\bin\g++.exe main.cpp -L"C:\lua\libs" -llua5.1

из консоли минимальный пример, без Qt, компилится так?


Название: Re: Lua + QT
Отправлено: edg3 от Апрель 23, 2011, 09:47
перенес заголовочные файлы к g++.exe в каталог, те же ошибки. может я не правильно скомпилировал lua? компилировал через visual studio 2008, там специальный бат файл для нее


Название: Re: Lua + QT
Отправлено: brankovic от Апрель 23, 2011, 11:12
перенес заголовочные файлы к g++.exe в каталог, те же ошибки. может я не правильно скомпилировал lua? компилировал через visual studio 2008, там специальный бат файл для нее

Что-то застряло дело совсем. Если компилировать из командной строки через g++ и указать статическую библиотеку напрямую, то работает? так:

g++.exe my.cpp "C:\path\to\lua\liblua51.a"

Если это не работает, то библиотека плохо скомпилировалась.


Название: Re: Lua + QT
Отправлено: edg3 от Апрель 24, 2011, 14:45
у меня после компиляции lua51.a не появилось, токлько lua51.dll и lua51.lib


Название: Re: Lua + QT
Отправлено: Fat-Zer от Апрель 24, 2011, 20:10
edg3 опечатался... в винде статические библиотеки имеют расширение *.lib


Название: Re: Lua + QT
Отправлено: edg3 от Апрель 25, 2011, 01:35
собралось нормально. без ошибок. так всетаки как же мне настроить qt?


Название: Re: Lua + QT
Отправлено: Fat-Zer от Апрель 25, 2011, 01:59
скиньте команды, которые в логи при компиляции светятся


Название: Re: Lua + QT
Отправлено: edg3 от Апрель 26, 2011, 09:38
Код:
Выполняется сборка проекта untitled...
Настройки не изменились, этап qmake пропускается.
Запускается "D:/Tutorial/Progs/Qt/2010.05/mingw/bin/mingw32-make.exe" -w
mingw32-make: Entering directory `D:/Tutorial/Progs/Qt/2010.05/untitled-build-desktop'

D:/Tutorial/Progs/Qt/2010.05/mingw/bin/mingw32-make -f Makefile.Debug

mingw32-make[1]: Entering directory `D:/Tutorial/Progs/Qt/2010.05/untitled-build-desktop'

g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\untitled.exe debug/main.o debug/QwtBeginner.o debug/dialog_window.o debug/moc_QwtBeginner.o debug/moc_dialog_window.o  -L"d:\Tutorial\Progs\Qt\2010.05\qt\lib" -lmingw32 -lqtmaind D:\Tutorial\Progs\tempius\qwt-5.2.1\qwt-5.2.1\lib\libqwt5.a D:\Tutorial\Progs\lua\lua51.dll "-LC:\lluaa\src -llua51" -lQtGuid4 -lQtCored4

debug/main.o: In function `Z5qMainiPPc':

D:\Tutorial\Progs\Qt\2010.05\untitled-build-desktop/../../../QT/2010.05/untitled/main.cpp:14: undefined reference to `luaL_newstate()'

D:\Tutorial\Progs\Qt\2010.05\untitled-build-desktop/../../../QT/2010.05/untitled/main.cpp:15: undefined reference to `luaL_openlibs(lua_State*)'

mingw32-make[1]: Leaving directory `D:/Tutorial/Progs/Qt/2010.05/untitled-build-desktop'

mingw32-make: Leaving directory `D:/Tutorial/Progs/Qt/2010.05/untitled-build-desktop'

D:\Tutorial\Progs\Qt\2010.05\untitled-build-desktop/../../../QT/2010.05/untitled/main.cpp:16: undefined reference to `luaL_loadfile(lua_State*, char const*)'

D:\Tutorial\Progs\Qt\2010.05\untitled-build-desktop/../../../QT/2010.05/untitled/main.cpp:16: undefined reference to `lua_pcall(lua_State*, int, int, int)'

D:\Tutorial\Progs\Qt\2010.05\untitled-build-desktop/../../../QT/2010.05/untitled/main.cpp:17: undefined reference to `lua_getfield(lua_State*, int, char const*)'

D:\Tutorial\Progs\Qt\2010.05\untitled-build-desktop/../../../QT/2010.05/untitled/main.cpp:18: undefined reference to `lua_pushnumber(lua_State*, double)'

D:\Tutorial\Progs\Qt\2010.05\untitled-build-desktop/../../../QT/2010.05/untitled/main.cpp:19: undefined reference to `lua_call(lua_State*, int, int)'

D:\Tutorial\Progs\Qt\2010.05\untitled-build-desktop/../../../QT/2010.05/untitled/main.cpp:20: undefined reference to `lua_tonumber(lua_State*, int)'

D:\Tutorial\Progs\Qt\2010.05\untitled-build-desktop/../../../QT/2010.05/untitled/main.cpp:21: undefined reference to `lua_close(lua_State*)'

collect2: ld returned 1 exit status

mingw32-make[1]: *** [debug\untitled.exe] Error 1

mingw32-make: *** [debug] Error 2

Процесс "D:/Tutorial/Progs/Qt/2010.05/mingw/bin/mingw32-make.exe" завершился с кодом %2.
Возникла ошибка при сборке проекта untitled (цель: Настольный компьютер)
Во время выполнения сборки на этапе "Сборка"


Название: Re: Lua + QT
Отправлено: Fat-Zer от Апрель 26, 2011, 11:52
ошибка в том, что это "-LC:\lluaa\src -llua51" заключено в кавычки...
в *.pro файле что находится?


Название: Re: Lua + QT
Отправлено: edg3 от Апрель 26, 2011, 23:44
в про файле
Код:
QT       += core gui

TARGET = untitled
TEMPLATE = app

INCLUDEPATH += D:\Tutorial\Progs\tempius\qwt-5.2.1\qwt-5.2.1\src
LIBS += D:\Tutorial\Progs\tempius\qwt-5.2.1\qwt-5.2.1\lib\libqwt5.a
INCLUDEPATH +=C:\lluaa\src
LIBS +=-L"C:\lluaa\src\" -llua51
SOURCES += main.cpp \
    QwtBeginner.cpp \
    dialog_window.cpp

HEADERS  += \
    QwtBeginner.h \
    dialog_window.h

FORMS    +=


Название: Re: Lua + QT
Отправлено: Fat-Zer от Апрель 27, 2011, 01:21
Цитировать
LIBS +=-L"C:\lluaa\src\" -llua51
а документацию почитать не пробовали?

Код:
LIBS += $$quote(C:\lluaa\src\lua51.lib)
для статической
Код:
LIBS += $$quote(-LC:\lluaa\src) -llua51
для динамеческой

ЗЫ: насчёт второго не уверен, но первое помочь должно...
ещё второе можно написать в две строки...
Да и quote по большому счёту не обязателен...


Название: Re: Lua + QT
Отправлено: edg3 от Апрель 27, 2011, 10:08
Код:
QT       += core gui

TARGET = untitled
TEMPLATE = app

INCLUDEPATH += D:\Tutorial\Progs\tempius\qwt-5.2.1\qwt-5.2.1\src
LIBS += D:\Tutorial\Progs\tempius\qwt-5.2.1\qwt-5.2.1\lib\libqwt5.a
INCLUDEPATH +=C:\lluaa\src
LIBS += $$quote(C:\lluaa\src\lua51.lib)
SOURCES += main.cpp \
    widget.cpp \

HEADERS  += widget.h \


FORMS    +=

и опять:
Код:
Выполняется сборка проекта test2...
Настройки не изменились, этап qmake пропускается.
Запускается "D:/Tutorial/Progs/Qt/2010.05/mingw/bin/mingw32-make.exe" -w
mingw32-make: Entering directory `D:/Tutorial/Progs/Qt/2010.05/test2-build-desktop'

d:\tutorial\progs\qt\2010.05\qt\bin\qmake.exe -spec ..\qt\mkspecs\win32-g++ -o Makefile ..\test2\test2.pro

mingw32-make: Leaving directory `D:/Tutorial/Progs/Qt/2010.05/test2-build-desktop'

WARNING: d:\Tutorial\Progs\Qt\2010.05\test2\test2.pro:12: Unescaped backslashes are deprecated.

WARNING: d:\Tutorial\Progs\Qt\2010.05\test2\test2.pro:12: Unescaped backslashes are deprecated.

WARNING: d:\Tutorial\Progs\Qt\2010.05\test2\test2.pro:12: Unescaped backslashes are deprecated.

mingw32-make: Entering directory `D:/Tutorial/Progs/Qt/2010.05/test2-build-desktop'

D:/Tutorial/Progs/Qt/2010.05/mingw/bin/mingw32-make -f Makefile.Debug

mingw32-make[1]: Entering directory `D:/Tutorial/Progs/Qt/2010.05/test2-build-desktop'

D:\Tutorial\Progs\Qt\2010.05\qt\bin\moc.exe -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"..\qt\include\QtCore" -I"..\qt\include\QtGui" -I"..\qt\include" -I"..\..\..\tempius\qwt-5.2.1\qwt-5.2.1\src" -I"c:\lluaa\src" -I"..\qt\include\ActiveQt" -I"debug" -I"..\test2" -I"." -I"..\qt\mkspecs\win32-g++" -D__GNUC__ -DWIN32 ..\test2\widget.h -o debug\moc_widget.cpp

g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"..\qt\include\QtCore" -I"..\qt\include\QtGui" -I"..\qt\include" -I"..\..\..\tempius\qwt-5.2.1\qwt-5.2.1\src" -I"c:\lluaa\src" -I"..\qt\include\ActiveQt" -I"debug" -I"..\test2" -I"." -I"..\qt\mkspecs\win32-g++" -o debug\moc_widget.o debug\moc_widget.cpp

g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\untitled.exe debug/main.o debug/widget.o debug/moc_widget.o  -L"d:\Tutorial\Progs\Qt\2010.05\qt\lib" -lmingw32 -lqtmaind D:\Tutorial\Progs\tempius\qwt-5.2.1\qwt-5.2.1\lib\libqwt5.a C:\lluaa\src\lua51.lib -lQtGuid4 -lQtCored4

mingw32-make[1]: Leaving directory `D:/Tutorial/Progs/Qt/2010.05/test2-build-desktop'

mingw32-make: Leaving directory `D:/Tutorial/Progs/Qt/2010.05/test2-build-desktop'

debug/main.o: In function `Z5qMainiPPc':

D:\Tutorial\Progs\Qt\2010.05\test2-build-desktop/../test2/main.cpp:14: undefined reference to `luaL_newstate()'

D:\Tutorial\Progs\Qt\2010.05\test2-build-desktop/../test2/main.cpp:15: undefined reference to `luaL_openlibs(lua_State*)'

D:\Tutorial\Progs\Qt\2010.05\test2-build-desktop/../test2/main.cpp:16: undefined reference to `luaL_loadfile(lua_State*, char const*)'

D:\Tutorial\Progs\Qt\2010.05\test2-build-desktop/../test2/main.cpp:16: undefined reference to `lua_pcall(lua_State*, int, int, int)'

D:\Tutorial\Progs\Qt\2010.05\test2-build-desktop/../test2/main.cpp:17: undefined reference to `lua_getfield(lua_State*, int, char const*)'

D:\Tutorial\Progs\Qt\2010.05\test2-build-desktop/../test2/main.cpp:18: undefined reference to `lua_pushnumber(lua_State*, double)'

D:\Tutorial\Progs\Qt\2010.05\test2-build-desktop/../test2/main.cpp:19: undefined reference to `lua_call(lua_State*, int, int)'

D:\Tutorial\Progs\Qt\2010.05\test2-build-desktop/../test2/main.cpp:20: undefined reference to `lua_tonumber(lua_State*, int)'

D:\Tutorial\Progs\Qt\2010.05\test2-build-desktop/../test2/main.cpp:21: undefined reference to `lua_close(lua_State*)'

collect2: ld returned 1 exit status

mingw32-make[1]: *** [debug\untitled.exe] Error 1

mingw32-make: *** [debug] Error 2

Процесс "D:/Tutorial/Progs/Qt/2010.05/mingw/bin/mingw32-make.exe" завершился с кодом %2.
Возникла ошибка при сборке проекта test2 (цель: Настольный компьютер)
Во время выполнения сборки на этапе "Сборка"
причем, если нажать на функции "найти использование" то найдет.


Название: Re: Lua + QT
Отправлено: Fat-Zer от Апрель 27, 2011, 14:14
а если последнюю команду из консоли выполнить?


Название: Re: Lua + QT
Отправлено: edg3 от Апрель 28, 2011, 00:44
а если последнюю команду из консоли выполнить?
если с консоли скомпилить, ну ввести mingw32-make release все равно не видит оно функций lua ((


Название: Re: Lua + QT
Отправлено: Fat-Zer от Апрель 28, 2011, 01:11
если с консоли скомпилить, ну ввести mingw32-make release все равно не видит оно функций lua ((
нет, я про
Код:
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\untitled.exe debug/main.o debug/widget.o debug/moc_widget.o  -L"d:\Tutorial\Progs\Qt\2010.05\qt\lib" -lmingw32 -lqtmaind D:\Tutorial\Progs\tempius\qwt-5.2.1\qwt-5.2.1\lib\libqwt5.a C:\lluaa\src\lua51.lib -lQtGuid4 -lQtCored4 
в ней вроде всё правильно прописано...


Название: Re: Lua + QT
Отправлено: edg3 от Апрель 28, 2011, 01:20
ну, попробовал, все равно не пашет.(


Название: Re: Lua + QT
Отправлено: m_ax от Апрель 28, 2011, 01:36
Да просто пропишите в .pro файле

INCLUDEPATH += c:/lluaa/include - путь к хедерам
LIBPATH = c:/lluaa/lib - путь к либам
LIBS +=-L$$LIBPATH -llua51

соблюдая синтаксис приведённый выше.