Не удается загрузить динамическую библиотеку C при компиляции программы C с помощью liblua.a (lua5.3)

Сначала я загружаю lua-5.3.5, помещаю исходный код в свой рабочий каталог и компилирую его с помощью

make linux

поэтому я получил бинарный файл liblua.a и lua в ./lua-5.3.5/src.

И затем я пишу динамическую библиотеку C следующим образом:

#include <stdio.h>
#include <math.h>
#include <stdarg.h>
#include <stdlib.h>

#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

static int l_sin(lua_State *L) 
{   
    double d = luaL_checknumber(L, 1); 
    lua_pushnumber(L, sin(d));  /* push result */

    return 1;  /* number of results */
}


static const struct luaL_Reg mylib[] = { 
    {"mysin", l_sin},
    {NULL, NULL}
};

extern int luaopen_mylib(lua_State* L)
{
    luaL_newlib(L, mylib);

    return 1;
}

Я компилирую командой:

gcc mylib.c -I ./lua-5.3.5/src -fPIC -shared -o mylib.so -Wall

И если я использую исходный двоичный файл lua, его можно загрузить

user00:lua/ $ ./lua-5.3.5/src/lua                                                                                                                                                                    
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
> require 'mylib'
table: 0xd13170
> 

Но если я напишу программу на языке C, связанную с liblua.a, она не сможет загрузить динамическую библиотеку.

#include <stdio.h>
#include <string.h>

#include "lua.h"           
#include "lauxlib.h"       
#include "lualib.h"

int main(void){
    char buff[256];
    int error;
    lua_State *L  = luaL_newstate();
    luaL_openlibs(L);

    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);
        }
    }

    lua_close(L);
    return 0;
}

Скомпилировать:

gcc test01.c -L ./lua-5.3.5/src/ -llua -lstdc++ -o test01 -lm -ldl -I ./lua-5.3.5/src

Бежать:

user00:lua/ $ ./test01                                                                                                         
require 'mylib'
error loading module 'mylib' from file './mylib.so':
    ./mylib.so: undefined symbol: luaL_setfuncs

person Lynton    schedule 24.12.2019    source источник


Ответы (1)


Вам необходимо экспортировать функции Lua API из исполняемого файла. Для этого слинкуйте его с -Wl,-E, как это делает Makefile из дистрибутива Lua.

person lhf    schedule 24.12.2019
comment
Спасибо, это работает. ` gcc test01.c -L ./lua-5.3.5/src/ -llua -lstdc++ -o test01 -lm -ldl -I ./lua-5.3.5/src -Wl,-E` - person Lynton; 25.12.2019