我用C编写了一个小Lua模块,它利用libuuid生成一个UUID。您可以在https://github.com/Mashape/lua-uuid找到来源
这个库在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,有什么明显的地方我遗漏了吗?

最佳答案

在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中的所有symbolds都被认为是不必要的,并被排除在最终构建之外,因为它们还没有被引用。将-luuid移动到链接器命令行的末尾(在lua_uuid.o的右侧)可以解决此问题。
已经有一些Stackoverflow答案解释了这些细节:
Why does the order in which libraries are linked sometimes cause errors in GCC?
Why does the order of '-l' option in gcc matter?

关于c - 执行应用程序时找不到libuuid库,尽管它可以完美编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33813615/

10-09 01:02