Форум 3DNews
Вернуться   Форум 3DNews > Программирование > Программирование

Ответ Создать новую тему
Опции темы Опции просмотра
Непрочитано 21.04.2007, 19:42   [включить плавающее окно]   #1
RMV
Мужской Общительный
Автор темы
 
Регистрация: 22.12.2003
Адрес: Н.Н.
Проблемы с подключением LUA через extern "C"

Проблемы с подключением LUA через extern "C"

Захотел включить в свой проект на C++ скриптовый язык.
(Ну чтобы часть кода писать на кросс-платформенном языке и потом использовать в др. проектах не заботсясь особенно на чём он написан)
Под руку попался Lua ( http://www.lua.org/ )
Нашёл некоторые статьи на русском.

Теперь, проблема:
По адресу http://kolega.vrn.ru/articles/step2/index.html
есть статья и пример кода. Он не работает.
Есть ещё пример, но там тоже что-то не так.
Разобраться не могу.

Компилировал WinGW на Dev-C++ и Microsoft Visual C++ 6.0

Собственно не могу подключить Lua в проект.
Ситуация:
В Lua еть файл all.c следующего содержания:
Код:
/*
* all.c -- Lua core, libraries and interpreter in a single file
*/

#define luaall_c

#include "lapi.c"
#include "lcode.c"
#include "ldebug.c"
#include "ldo.c"
#include "ldump.c"
#include "lfunc.c"
#include "lgc.c"
#include "llex.c"
#include "lmem.c"
#include "lobject.c"
#include "lopcodes.c"
#include "lparser.c"
#include "lstate.c"
#include "lstring.c"
#include "ltable.c"
#include "ltm.c"
#include "lundump.c"
#include "lvm.c"
#include "lzio.c"

#include "lauxlib.c"
#include "lbaselib.c"
#include "ldblib.c"
#include "liolib.c"
#include "linit.c"
#include "lmathlib.c"
#include "loadlib.c"
#include "loslib.c"
#include "lstrlib.c"
#include "ltablib.c"

#include "lua.c"
Он превосходно компилируется.

Если переименовать файл в all.cpp, то выдаются ошибки, даже если переделать файл вот так:
Код:
#include <stdio.h>

// Подключаем необходимые для работы с lua заголовочные файлы.
extern "C"
{
     ...
     содержимое all.c
     ...
}
Исходя из этого делаю вывод, что у проблема в extern "C".

PS: В принципе, если посоветуете др. язык с которым будет меньше проблем - замечательно.
__________________
Hi, from RMV!
RMV вне форума  
Ответить с цитированием
Непрочитано 22.04.2007, 17:14   [включить плавающее окно]   #2
Unconnected
Мужской Бывалый
 
Аватар для Unconnected
 
Регистрация: 20.07.2004
все С-шные заголовочные файлы надо подключать так:
extern "C"
{
#include <all.h>
}
а потом компилятор сам поймёт, что ты хочешь
а компилироваться будет по отдельности - С и С++, а линкер потом всё это скомпонует вместе
Unconnected вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 23.04.2007, 21:30   [включить плавающее окно]   #3
RMV
Мужской Общительный
Автор темы
 
Регистрация: 22.12.2003
Адрес: Н.Н.
Попробовал.
Ошибки вроде те-же.
Совсем не понимаю в чём дело.
Файл
main.c
Код:
    #include "all.c"
Компилируется превосходно, а

main.cpp
Код:
extern "C"
{
    #include "all.c"
};
выдаёт ошибки:
Код:
Компилятор: Default compiler
Компилятор: Default compiler
Выполнение  g++.exe...
g++.exe "C:\Lua\src\main.cpp" -o "C:\Lua\src\main.exe"   -g3  -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include"  -I"C:\Dev-Cpp\include\c++\3.4.2\backward"  -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32"  -I"C:\Dev-Cpp\include\c++\3.4.2"  -I"C:\Dev-Cpp\include"   -L"C:\Dev-Cpp\lib" -g3 
In file included from C:\Lua\src\/lapi.h:11,
                 from C:\Lua\src\/lapi.c:18,
                 from C:\Lua\src\/all.c:7,

                 from C:\Lua\src\main.cpp:3:
C:\Lua\src\/lobject.h:365: error: uninitialized const `luaO_nilobject_'

In file included from C:\Lua\src\/lstate.h:13,
                 from C:\Lua\src\/ldebug.h:11,

                 from C:\Lua\src\/lapi.c:19,
                 from C:\Lua\src\/all.c:7,
                 from C:\Lua\src\main.cpp:3:

C:\Lua\src\/ltm.h:46: error: uninitialized const `luaT_typenames'
C:\Lua\src\/ltm.h:46: error: storage size of `luaT_typenames' isn't known
C:\Lua\src\/ltm.h:46: error: storage size of `luaT_typenames' isn't known

In file included from C:\Lua\src\/lcode.h:10,
                 from C:\Lua\src\/lcode.c:15,
                 from C:\Lua\src\/all.c:8,
                 from C:\Lua\src\main.cpp:3:
C:\Lua\src\/llex.h:40: error: uninitialized const `luaX_tokens'
C:\Lua\src\/llex.h:40: error: storage size of `luaX_tokens' isn't known
C:\Lua\src\/llex.h:40: error: storage size of `luaX_tokens' isn't known

In file included from C:\Lua\src\/lcode.h:12,
                 from C:\Lua\src\/lcode.c:15,
                 from C:\Lua\src\/all.c:8,
                 from C:\Lua\src\main.cpp:3:
C:\Lua\src\/lopcodes.h:252: error: uninitialized const `luaP_opmodes'
C:\Lua\src\/lopcodes.h:261: error: uninitialized const `luaP_opnames'

In file included from C:\Lua\src\/all.c:14,
                 from C:\Lua\src\main.cpp:3:
C:\Lua\src\/llex.c:37: error: redefinition of `const char* const luaX_tokens[]'
C:\Lua\src\/llex.h:40: error: `<typeprefixerror> luaX_tokens' previously declared here

In file included from C:\Lua\src\/all.c:16,
                 from C:\Lua\src\main.cpp:3:
C:\Lua\src\/lobject.c:27: error: redefinition of `const TValue luaO_nilobject_'
C:\Lua\src\/lobject.h:365: error: `const TValue luaO_nilobject_' previously declared here

In file included from C:\Lua\src\/all.c:17,
                 from C:\Lua\src\main.cpp:3:
C:\Lua\src\/lopcodes.c:16: error: redefinition of `const char* const luaP_opnames[39]'
C:\Lua\src\/lopcodes.h:261: error: `const char* const luaP_opnames[39]' previously declared here

C:\Lua\src\/lopcodes.c:61: error: redefinition of `const lu_byte luaP_opmodes[38]'
C:\Lua\src\/lopcodes.h:252: error: `const lu_byte luaP_opmodes[38]' previously declared here

In file included from C:\Lua\src\/all.c:22,
                 from C:\Lua\src\main.cpp:3:
C:\Lua\src\/ltm.c:23: error: redefinition of `const char* const luaT_typenames[]'
C:\Lua\src\/ltm.h:46: error: `<typeprefixerror> luaT_typenames' previously declared here

Выполнение завершено
__________________
Hi, from RMV!
RMV вне форума  
Ответить с цитированием
Непрочитано 26.04.2007, 15:32   [включить плавающее окно]   #4
Maxim Kizub
Мужской Новенький
 
Регистрация: 24.03.2007
RMV
Тебе про header файлы говорят, как их включать. Там объявления, декларации.
А ты включаешь исходный текст программы.
Тебе её надо C-шным компилятором компилировать, а не С++-ным. А в С++-ые исходники делать #include для .h файлов.
Maxim Kizub вне форума  
Ответить с цитированием
Непрочитано 27.04.2007, 00:30   [включить плавающее окно]   #5
RMV
Мужской Общительный
Автор темы
 
Регистрация: 22.12.2003
Адрес: Н.Н.
Речь не совсем об этом.
Статическую библиотеку я получаю без проблем.
Получается файл lualib.a
Я использовать её фактически не могу.

Беру пример http://kolega.vrn.ru/articles/step2/index.html (или любой другой, но тогда ошибки др. но похожие: при создании виртуальной машины)
Код:
#include <stdio.h>

// Подключаем необходимые для работы с lua заголовочные файлы.
extern "C"
{
        // Основной заголовочный файл для работы с lua.
        #include <lua.h>

        // Заголовочный файл, содержащий дополнительные библиотеки.
        // Например, для работы с матемачиским функциями в скриптах
        // или для работы со строками.
        #include <lualib.h>

        // Заголовочный файл библиотеки, содержащей полезные
        // функции при интерграции lua и приложения на С++.
        #include <lauxlib.h>
}

// Подключаем, собранную в Шаге 1, статическую библиотеку
#pragma comment(lib, "lualibs.lib")

int main()
{
        // Дискриптор нашей виртуальной машины.
        lua_State *lua = 0;

        // Создаем виртуальную машину.
        lua = luaL_newstate();

        // Возможно ситуация, когда не получилось создать новую
        // виртуальную машину lua, и её надо отслеживать.
        if( lua == 0 )
        {
                printf("Error! Lua doesn't init.");
                return 0;
        }

        // Инициализируем для работы основные библиотеки lua.
        luaopen_base(lua);
        luaopen_table(lua);
        luaopen_math(lua);
        luaopen_string(lua);

        // Запуск на выполнение скрипта lua.
        luaL_dofile(lua, "script.lua");

        // Освобождение ресурсов, занятых виртуальной машиной lua.
        lua_close(lua);

        return 0;
}
Меняю
Код:
    #pragma comment(lib, "lualibs.lib")
на
Код:
    #pragma comment(lib, "lualibs.a")
или
Код:
    #pragma comment(a, "lualibs.a")
Ошибки:
Код:
Компилятор: Default compiler
Building Makefile: "Makefile.win"
Выполнение  make clean
rm -f ../bin/obj/main.o ../bin/obj/ai_war_private.res ../bin/ai_war.exe

g++.exe -D__DEBUG__ -c cpp/main.cpp -o ../bin/obj/main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include"  -I"C:/lua/test/source/omega"  -I"C:/lua/test/source/h"  -I"C:/lua/test/source/lua"  -I"C:/Dev-Cpp/include"  -I"C:/Dev-Cpp/lib"  -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"    -g3 -mwindows

cpp/main.cpp: In function `int main(int, char**)':
cpp/main.cpp:354: error: `luaL_newstate' undeclared (first use this function)
cpp/main.cpp:354: error: (Each undeclared identifier is reported only once for each function it appears in.)

make.exe: *** [../bin/obj/main.o] Error 1

Выполнение завершено

RMV добавил :

Просто я пытался понять: в чём ошибка...
__________________
Hi, from RMV!
RMV вне форума  
Ответить с цитированием
Непрочитано 19.09.2007, 23:12   [включить плавающее окно]   #6
RMV
Мужской Общительный
Автор темы
 
Регистрация: 22.12.2003
Адрес: Н.Н.
Ниужели никто не подскажет?
__________________
Hi, from RMV!
RMV вне форума  
Ответить с цитированием
Непрочитано 27.09.2007, 16:22   [включить плавающее окно]   #7
Phodopus
Мужской Продвинутый
 
Регистрация: 05.10.2005
Адрес: Санкт-Петербург
есть там файлик hpp - вот его и используй
Phodopus вне форума  
Ответить с цитированием
Ответ Создать новую тему

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 10:56. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 2000-2017 3DNews. All Rights Reserved.
Администрация 3DNews требует соблюдения на форуме правил и законов РФ
Серверы размещены в Hostkey