2014-10-01 53 views
1

我有一個名爲「test.so」的庫,它使用來自兩個相互引用的庫的函數。如果我在C程序中調用test.so的函數,它工作得很好,所以我假設在C函數中沒有錯誤。從Lua調用時未定義的符號

但是,當我從Lua調用它時,由於「未定義符號」,它會引發Seg Fault錯誤。問題是,符號被定義,當我運行nm test.so時,我可以看到它。

閱讀下面

Lua: C++ modules can't reference eachother, undefined symbol

線程我試圖創建一個新的模塊,將通過描述瑞納加載test.so使用dlopen,。

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

實際打開的lib,但我得到這個錯誤:

$ 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]: ? 

引用的問題筆者不顯示解決方案的開發細節。 有沒有人有什麼可能使其工作的線索?

在此先感謝。

回答

2

我顯然是做錯了,得到實際打開庫的函數,我應該使用ldsym函數。對於DRMAA LIB(加載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