BRUC
@BRUC
"А зори здесь тихие..."

Две функции main?

Добрый день. Подключал Lua к C++. Занимаюсь этим первый раз. И столкнулся с таким логом:
1>------ Сборка начата: проект: Game, Конфигурация: Debug x64 ------
1>Сборка начата 27.09.2016 20:01:25.
1>     1>
1>InitializeBuildStatus:
1>         Обращение к "x64\Debug\Game.tlog\unsuccessfulbuild".
1>       ClCompile:
1>         Для всех выходных данных обновления не требуется.
1>         Для всех выходных данных обновления не требуется.
1>     1>
1>lua.obj : error LNK2005: main уже определен в Sourse.obj
1>     1>
1>luac.obj : error LNK2005: main уже определен в Sourse.obj
1>     1>
1>c:\users\домашний\documents\visual studio 2015\Projects\Game\x64\Debug\Game.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более
1>
1>Ошибка сборки.
1>
1>Затраченное время: 00:00:00.48
========== Сборка: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========


Проблема в том, что в файле lua.c присутствует функция main:
int main (int argc, char **argv) {
  int status, result;
  lua_State *L = luaL_newstate();  /* create state */
  if (L == NULL) {
    l_message(argv[0], "cannot create state: not enough memory");
    return EXIT_FAILURE;
  }
  lua_pushcfunction(L, &pmain);  /* to call 'pmain' in protected mode */
  lua_pushinteger(L, argc);  /* 1st argument */
  lua_pushlightuserdata(L, argv); /* 2nd argument */
  status = lua_pcall(L, 2, 1, 0);  /* do the call */
  result = lua_toboolean(L, -1);  /* get result */
  report(L, status);
  lua_close(L);
  return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
}

А так же в файле luac.c то же присутствует функция main:
int main(int argc, char* argv[])
{
 lua_State* L;
 int i=doargs(argc,argv);
 argc-=i; argv+=i;
 if (argc<=0) usage("no input files given");
 L=luaL_newstate();
 if (L==NULL) fatal("cannot create state: not enough memory");
 lua_pushcfunction(L,&pmain);
 lua_pushinteger(L,argc);
 lua_pushlightuserdata(L,argv);
 if (lua_pcall(L,2,0,0)!=LUA_OK) fatal(lua_tostring(L,-1));
 lua_close(L);
 return EXIT_SUCCESS;
}


Попробовал собрать решение без моей функции main(), но конечно ни чего не получилось. Так как их все равно две, в файлах: luac.c; lua.c;
Что с этим делать, как бороться?
З.ы. Использовал последнюю версию Lua.
  • Вопрос задан
  • 624 просмотра
Решения вопроса 1
romy4
@romy4
Exception handler
Lua должен быть собран как библиотека. Соответственно, там не будет main()
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
vit1251
@vit1251
Software Engineer
Господа следует понимать, что Вы делаете:

1. lua.c это интерактивный шелл и одновременно интерпритатор Lua (должен быть сборан с liblua);
2. luac.c это транслятор в байткод Lua (должен быть соборан с liblua);
3. liblua это статическая(или динамическая) библиотека (должна быть собрана без файлов [lua.c, luac.c]);

Более подробно можно найти в директории с документацией в том же каталоге или в Makefile:

lua is the stand-alone Lua interpreter. It loads and executes Lua programs, either in textual source form or in precompiled binary form. (Precompiled binaries are output by luac, the Lua compiler.) lua can be used as a batch interpreter and also interactively.

luac is the Lua compiler. It translates programs written in the Lua programming language into binary files that can be loaded and executed with lua_dofile in C or with dofile in Lua.
Ответ написан
Комментировать
Olej
@Olej
инженер, программист, преподаватель
Lua должен быть собран как библиотека.

Да ничего подобного. ;-)

Так как их все равно две, в файлах: luac.c; lua.c;

Если вы посмотрите внимательно, то ваши luac.c и lua.c - это дубликаты демонстрационных примеров.
А то, что делается в lua.c для иллюстрации вызова Lua, вам просто нужно текстуально перенести в ваш программный код C ... например, в функцию main() в нужное место.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы