簡體   English   中英

解開Lua和C代碼以使Lua依賴可選

[英]Untangling Lua & C code to make Lua dependency optional

我在C中編寫了一個小程序來管理SQLite3中的參考書目數據庫。 到目前為止,這只是一個允許導入和導出BibTeX數據的命令行工具。 為了使導出/導入功能更具可定制性(例如,總是在導入時將日期和月份字段組合在一起,或者在導出時跳過某些字段),這些函數用Lua編寫並從C調用。 現在我希望Lua成為可選的依賴項。 有什么好辦法呢? 即如果在編譯時沒有找到Lua,則回退到更基本的導入/導出功能。

現在,例如在導出時,我從SQL(sqlite3_exec)獲取數據並將其直接寫入回調函數中的Lua表,就像這樣(stripped stackoverflow-handling ;-)):

int db_meta_cb(void *udata, int n, char **cval, char **ckey) {
  while (n-- > 0) {
    lua_pushstring(L, cval[n]);
    lua_setfield(L, -2, ckey[n]);
  };
};

然后有一個Lua函數,它將這樣一個表作為參數並漂亮地打印一個BibTeX條目。 類似的導入故事:BibTeX解析器(Lex / YACC生成的C代碼)編寫Lua表並調用'cleanup'Lua函數,然后從同一個Lua表讀取結果並將其插入數據庫。

現在這在我使用Lua太多的意義上感覺不對,我猜因為數據包含(鍵,值) - pairs。

請注意,這個項目的一個原因是試驗/了解在C中嵌入Lua,所以請不要建議(a)使用一個可用的參考書目管理器,或者(b)完全重寫Python或Lua中的所有內容...... (我已經完成了btw)

我看到這個問題的最優雅方式是通過動態加載 在運行時,不是將程序與lua鏈接,而是嘗試使用dlopen函數系列手動加載庫。

如果失敗則可以設置一個全局標志,您需要使用其他方法來提供功能,但如果成功則使用dlsym函數從lua共享對象中獲取函數並使用它們。 您可以生成一個非常優雅的解決方案,在其中使用lua或舊版本填充一些函數指針,然后您可以簡單地做出一次決策並調用函數而不關心正在使用哪個實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM