2015-11-19 55 views
1

我在C中編寫了一個小的Lua模塊,它生成了一個利用libuuid的UUID。您可以在https://github.com/Mashape/lua-uuid執行應用程序時找不到libuuid庫,儘管它編譯完美

找到源文件該庫在OSX和CentOS上正常工作。我目前有Ubuntu的一個問題,雖然庫編譯成功,執行它拋出以下異常:

lua: error loading module 'lua_uuid' from file './lua_uuid.so': 
    ./lua_uuid.so: undefined symbol: uuid_generate 
stack traceback: 
    [C]: ? 
    [C]: in function 'require' 
    /test.lua:1: in main chunk 
    [C]: ? 

好像圖書館找不到libuuid依賴,雖然在Makefile包括-luuid標誌(https://github.com/Mashape/lua-uuid/blob/master/Makefile#L4)。

複製的問題,這些都是需要的相關性:

apt-get install lua5.1 luarocks unzip git make gcc uuid-dev 
wget https://github.com/Mashape/lua-uuid/archive/0.1-7.zip -O /tmp/lua_uuid.zip 
unzip /tmp/lua_uuid.zip -d /tmp 
cd /tmp/lua-uuid-0.1-7/ && luarocks make lua_uuid-0.1-7.rockspec 

然後你可以運行下面的Lua腳本:

local uuid = require "lua_uuid" 
local uuid_str = uuid() 

print("New UUID: "..uuid_str) 

我不精通C和Makefile文件,是有什麼顯然我失蹤了?

+0

我怎麼看不到,即使編譯。我會期望'lua_uuid.so'目標在符號上失敗。也爲了不實際生成共享對象。 –

+0

Luarocks會自動填充'LUA_INCDIR'嗎?或者你在你的環境中有嗎? LIBFLAG呢? –

+0

@EtanReisner是的,luarocks自動填充這些變量:https://github.com/Mashape/lua-uuid/blob/master/lua_uuid-0.1-7.rockspec#L20-L28 – Mark

回答

2

編譯使用在Ubuntu結果LuaRocks在以下編譯器命令行該模塊:

gcc -c -O2 -fPIC -I/usr/include/lua5.1 lua_uuid.c -o lua_uuid.o 
gcc -shared -luuid -o lua_uuid.so -L/usr/lib lua_uuid.o 

庫libuuid可作爲靜態庫,它是引用其符號對象文件之前列出。由於GNU鏈接器從左到右檢查庫/對象文件,所以libuuid中的所有符號都被認爲是不必要的,因爲它們還沒有被引用,所以它們不在最終版本中。將-luuid移動到鏈接器命令行的末尾(在lua_uuid.o的右側)可以解決問題。

已經有解釋的細節部分答案#1:

相關問題