2012-12-03 42 views
0

我有後續問題。 我有位於parser.o庫中的文本分析器。我想解析一些文本(查找函數)並調用它們。函數在functions.o文件中實現。我能夠解析文本,但我不知道如何從庫函數調用函數。我使用dlopen(NULL, RTLD_NOW);來獲取主程序的引用,但是當我運行實際的程序時,它無法找到給定的功能,出現錯誤"./program: undefined symbol: function_name"(function_name位於functions.o):/。我不能鏈接與dlopen(functions.o,...) functions.o,因爲它不是動態鏈接庫。我正在編譯程序:C - 解析文本和調用函數

`gcc main.c lib/*` 

任何幫助? :)

+2

請向我們展示一些代碼或調用gcc。通常情況下,gcc a.c b.c -o exe會靜態鏈接,而不需要dlopen()。 –

+0

我可以編譯(和鏈接庫)程序沒有問題。但我試圖解析文本並調用文本中提到的函數(嘗試創建我自己的簡單scipting語言)。這就是爲什麼我試圖使用dlopen – user1453857

回答

0

dlopen(NULL,RTLD_NOW);

而不是做dlopendlsym,只需直接調用函數。由於您將所有內容鏈接到主要可執行文件中,因此完全可以使用沒有理由使用dlopen

1

如果您必須靜態鏈接程序,並且所有函數共享一個簽名,您可以定義自己的函數指針表。

struct entry 
{ 
    const char * const func_name; 
    void (*func) (void); 
}; 

static struct entry table[] = 
{ 
    {"func_A", func_A}, 
    {"func_B", func_B}, 
    ... 
}; 

你比從輸入中查找函數的名稱,並通過指針調用它。如果函數簽名不同,仍然可以使用包裹你的函數調用的thunk來完成。

void func_A_thunk(void* dummy, ...) 
{ 
    // parse the var_args to match the signature for func_A 
    func_A (arg1, arg2, arg3); 
} 

所有這一切都已經說......這是相當混亂,所以只編譯庫代碼爲動態鏈接庫,如果你能,並使用dlopen正常。