执行应用程序时找不到 libuuid 库,尽管它可以完美编译
libuuid library not found when executing application, although it compiles perfectly
我用 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 链接器从左到右检查 libraries/object 文件,因此 libuuid 中的所有符号都被认为是不必要的,并且由于尚未被引用而被排除在最终构建之外。将 -luuid
移动到链接器命令行的末尾(lua_uuid.o
的右侧)修复了该问题。
已经有一些解释细节的 Whosebug 答案:
- 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 写了一个小 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 链接器从左到右检查 libraries/object 文件,因此 libuuid 中的所有符号都被认为是不必要的,并且由于尚未被引用而被排除在最终构建之外。将 -luuid
移动到链接器命令行的末尾(lua_uuid.o
的右侧)修复了该问题。
已经有一些解释细节的 Whosebug 答案:
- Why does the order in which libraries are linked sometimes cause errors in GCC?
- Why does the order of '-l' option in gcc matter?