Невозможно связать минимальную программу Lua - PullRequest
5 голосов
/ 11 ноября 2010

У меня есть следующая тривиальная программа Lua, которую я скопировал из книги Программирование на Lua

#include <stdio.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
int main (void) 
{
    char buff[256];
    int error;
    lua_State *L = luaL_newstate(); /* opens Lua */
    luaL_openlibs(L); /* opens the standard libraries */
    while (fgets(buff, sizeof(buff), stdin) != NULL) 
    {
        error = luaL_loadbuffer(L, buff, strlen(buff), "line") ||
        lua_pcall(L, 0, 0, 0);

        if (error) 
        {
            fprintf(stderr, "%s", lua_tostring(L, -1));
            lua_pop(L, 1); /* pop error message from the stack */
        }
    }
    lua_close(L);
    return 0;
}

моя среда - Cywin

, мой make-файл выглядит так:

CC=gcc
INCLUDE='-I/home/xyz/c_drive/Program Files/Lua/5.1/include'
LINKFLAGS='-L/home/xyz/c_drive/Program Files/Lua/5.1/lib' -llua51 

li.o:li.c
    $(CC) $(INCLUDE)   -c li.c

main:li.o
    $(CC)  -o main  $(LINKFLAGS) li.o 

clean:
    rm *.o
    rm main

Мои / home / xyz / c_drive / Program Files / Lua / 5.1 / lib каталог содержит lua5.1.dll lua5.1.lib lua51.dll и lua51.lib

Попытка построить мой основнойtarget Я получаю следующие ошибки:

li.o:li.c:(.text+0x35): undefined reference to `_luaL_newstate'
li.o:li.c:(.text+0x49): undefined reference to `_luaL_openlibs'
li.o:li.c:(.text+0xaf): undefined reference to `_luaL_loadbuffer'
li.o:li.c:(.text+0xd9): undefined reference to `_lua_pcall'
li.o:li.c:(.text+0x120): undefined reference to `_lua_tolstring'
li.o:li.c:(.text+0x154): undefined reference to `_lua_settop'
li.o:li.c:(.text+0x167): undefined reference to `_lua_close'

Есть какие-либо идеи о том, что я могу делать неправильно?

Ответы [ 2 ]

9 голосов
/ 11 ноября 2010

Проблема в том, что вы назвали библиотеки в командной строке ссылки перед объектными файлами, которые в них нуждаются.Компоновщик загружает модули слева направо в командной строке.В точке на линии, где вы называете -llua51, неизвестные символы, которые могли бы быть удовлетворены этой библиотекой, не известны.Затем вы называете li.o, у которого есть неизвестные символы.

В некоторых Unix-подобных средах это не рассматривается как ошибка, поскольку часть процесса компоновки откладывается до загрузки программы при ссылке на .soфайлы удовлетворены.Но Cygwin, MinGW и Windows в целом должны воспринимать это как ошибку, поскольку библиотеки DLL работают совершенно иначе, чем .so файлы.

Решение состоит в том, чтобы поставить -llua51 после всех .o файлов в вашей линии связи.

Редактировать: Кстати, похоже, вы ссылаетесь на дистрибутив Lua для Windows, но собираете его с GCC под Cygwin.Вы захотите использовать Dependency Walker , чтобы убедиться, что ваша программа не зависит от времени выполнения Cygwin, и что она зависит от того же времени выполнения C, что и lua51.dll из Lua для Windows.IIRC, это будет среда выполнения для предыдущей версии Visual Studio.Можно сделать ссылку GCC против этого, но вам нужно будет использовать порт MinGW (который вы можете использовать из Cygwin), и связать пару определенных библиотек, чтобы получить эту версию.Я далеко от моего обычного ПК, или я бы процитировал точную линию связи.(Я считаю, что вам нужно -lmoldname -lmsvcr80 или что-то в этом роде в качестве последних элементов в строке ссылки.)

Это приведет к таинственным и очень трудным диагностировать проблемы, если используется более одной библиотеки времени выполнения C.Простой ответ - использовать ту же самую, что и предпочитаемая вами Lua DLL.Другой альтернативой является то, что проект Lua Binaries имеет предварительно скомпилированные библиотеки Lua DLL для широкого набора инструментов C на Windows.Если вам нужно приложение Lua, которое понимает среду Cygwin, вам нужно приложение, созданное GCC для Cygwin, а не Lua для Windows.Lua Binaries будет вашим другом, или вы можете создать Lua самостоятельно из источника.

0 голосов
/ 11 ноября 2010

Имена в Lua API имеют , а не с тем, что имеют первые подчеркиванияПопробуйте скомпилировать с -fno-leading-underscore.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...