从Lua调用时出现未定义的符号。

我有一个名为“test.so”的库,它使用来自相互引用的两个库的函数。如果在C程序中调用test.so的函数,就能正常运行,所以我认为在C函数中没有错误。

但是,当我从Lua调用它时,会因为“未定义的符号”而抛出Seg Fault错误。问题在于,符号已定义,我可以看到当我运行nm test.so时。

读以下线程

Lua:C++模块不能相互引用,未定义的符号

我尝试创建一个新模块,该模块將使用dlopen加载test.so,如Rena所述。

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

#include <stdio.h>
#include <dlfcn.h>

int luaopen_drmaa(lua_State *L){
    printf("Chamou luaopen_test\n");
    if( dlopen("/home/erica/Downloads/test.so", RTLD_NOW | RTLD_GLOBAL) == NULL)
        printf("%s\n", dlerror());
    else
        printf("Chamou dlopen e teve retorno nao null\n");
    return 0;
}

我编译它:

gcc -g drmaa_lib.c -shared -fpic -I /usr/include/lua5.1 -I /usr/local/include/ -L /usr/local/lib/m -llua5.1 -o drmaa.so

但是当我运行时,我得到:

$ lua5.1
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
> require "drmaa"
Chamou luaopen_test
Chamou dlopen e teve retorno nao null
> submitJob()
stdin:1: attempt to call global 'submitJob' (a nil value)
stack traceback:
    stdin:1: in main chunk
    [C]: ?

然后我尝试在主函数中插入

luaopen_test(L);

在主函数之前

extern int luaopen_test(lua_State *L);

要实际打开库,但我会收到此错误:

$ lua5.1
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
> require "drmaa"
error loading module 'drmaa' from file './drmaa.so':
    ./drmaa.so: undefined symbol: luaopen_test
stack traceback:
    [C]: ?
    [C]: in function 'require'
    stdin:1: in main chunk
    [C]: ?

被引用的问题的作者没有显示解决方案的详细信息。有人有什么办法可以使其工作吗?

提前致谢。

点赞
用户3934900
用户3934900

我显然是做错了,为了获取实际打开库的函数,我应该使用 ldsym 函数。新的 drmaa 库代码(加载 test.so 的代码)如下:

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

#include <stdio.h>
#include <dlfcn.h>

typedef void Register(lua_State*);

int luaopen_drmaa(lua_State *L){

    void* lib = dlopen("/home/erica/Downloads/test.so", RTLD_NOW | RTLD_GLOBAL);
    if(!lib)
    {
        printf("%s\n", dlerror());
        return 1;
    }

    Register* loadFunc = (Register*)dlsym(lib, "luaopen_test");
    if(!loadFunc)
    {
        printf("%s\n", dlerror());
        return 1;
    }

    loadFunc(L);

    return 0;
}

该答案基于该线程的某些代码:

Lua shared object loading with C++ segfaults

2014-10-01 12:34:02