“无法解析符号”可能的原因是什么?

Lua 的交叉编译、测试模块和真实模块都正常,但是当我在运行 uClinux 的设备上加载真实模块时,会遇到以下错误:

appliance::/var/tmp> ./lua -l dummy
Hello from dummy
Bye from dummy
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio

appliance::/var/tmp> ./lua -l luasql.sqlite3
./lua: can't resolve symbol '_luaL_ref'

我没有足够的经验知道问题的根本原因,尽管谷歌似乎指向了共享库问题。可能模块希望某个库或某个库的特定版本,但却找不到?

有人以前看过这种类型的错误吗?我该如何调查?

谢谢。


编辑:这是我用于构建 Lua、SQLite3 和 LuaSQL for SQLite3 的配置/Makefiles:

# cat /var/tmp/lua-5.1.4/src/Makefile
MYCFLAGS=
MYLDFLAGS=
MYLIBS=

export PATH:=$(PATH):/usr/src/baps/opt/uClinux/bfin-linux-uclibc/bin

TARGET_CROSS=bfin-linux-uclibc-
export CC=$(TARGET_CROSS)gcc
export STRIP=$(TARGET_CROSS)strip
export AR=$(TARGET_CROSS)ar rcu
export RANLIB=$(TARGET_CROSS)ranlib
export STAGING_DIR=/usr/src/baps/uClinux-dist/staging
export UCLINUX_LIB=/usr/src/baps/uClinux-dist/lib
export UCLINUX_ROOT_LIB=/usr/src/baps/uClinux-dist/root/lib
export CFLAGS=-O2 -Wall -Wmissing-prototypes -Wmissing-declarations -I$(STAGING_DIR)/usr/include -DLUA_USE_POSIX -DLUA_USE_DLOPEN
export LDFLAGS= -L$(STAGING_DIR)/usr/lib -L$(UCLINUX_LIB) -L$(UCLINUX_ROOT_LIB) -ldl -lm

...
$(LUA_T): $(LUA_O) $(LUA_A)
        $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(LUA_O) $(LUA_A)

$(LUAC_T): $(LUAC_O) $(LUA_A)
        $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(LUAC_O) $(LUA_A)
...
generic:
        $(MAKE) all

# cat /var/tmp/sqlite-amalgamation-3070400/Makefile
export PATH:=$(PATH):/usr/src/baps/opt/uClinux/bfin-linux-uclibc/bin

TARGET_CROSS=bfin-linux-uclibc-
export CC=$(TARGET_CROSS)gcc
export STRIP=$(TARGET_CROSS)strip
export AR=$(TARGET_CROSS)ar rcu
export RANLIB=$(TARGET_CROSS)ranlib
export CFLAGS=-O2 -Wall

libsqlite3.o:
        $(CC) $(CFLAGS) -DSQLITE_THREADSAFE=0 -o $@ -c sqlite3.c

# cat /var/tmp/luasql-2.1.1/config
...
LUA_INC= /var/tmp/lua-5.1.4/src
LIB_OPTION= -shared #for Linux
...
DRIVER_LIBS= /var/tmp/sqlite-amalgamation-3070400/libsqlite3.o
DRIVER_INCS= -I/var/tmp/sqlite-amalgamation-3070400

WARN= -Wall
INCS= -I$(LUA_INC)
CFLAGS= -O2 $(WARN) -I$(COMPAT_DIR) $(DRIVER_INCS) $(INCS) $(DEFS)
CC=/usr/src/baps/opt/uClinux/bfin-linux-uclibc/bin/bfin-linux-uclibc-gcc
LDFLAGS = -Wl,--trace,--print-map,--cref

# cat /var/tmp/luasql-2.1.1/Makefile
...
src/$(LIBNAME): $(OBJS)
        $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(DRIVER_LIBS) $(LIB_OPTION)

编辑:在被告知这很可能是链接问题之后,经过更多阅读和试错,我终于发现了问题所在:构建 Lua 时需要使用以下选项:“-Wl,-E”。

原文链接 https://stackoverflow.com/questions/4794228

点赞
stackoverflow用户6688
stackoverflow用户6688

我没有使用 lua 的经验,但通常来说,当一个符号“未解析”时,这表明链接器无法在任何归档文件或库中找到该符号。你需要确定哪个库定义了这个符号,并在链接命令中包含它,通常使用 -l 标志。你可能还需要提供一个 -L 标志,指定包含这个库的目录。在你的 Makefile 中,你可以把这些标志添加到 LDFLAGS 变量中。

我没有使用 lua 的经验,但通常来说,当一个符号“未解析”时,这表明链接器无法在任何归档文件或库中找到该符号。你需要确定哪个库定义了这个符号,并在链接命令中包含它,通常使用 `-l` 标志。你可能还需要提供一个 `-L` 标志,指定包含这个库的目录。在你的 Makefile 中,你可以把这些标志添加到 `LDFLAGS` 变量中。
2011-01-25 15:52:46
stackoverflow用户1203281
stackoverflow用户1203281

除了上面的答案外,如果您在设备上运行,请确保您未链接到构建系统上的包含文件或库。您的开发系统$PATH变量可能指向本地包含文件和库。此外,您需要确保库位于设备的可用位置,通常在/bin或/lib中。

2012-02-11 02:29:18
stackoverflow用户1243877
stackoverflow用户1243877

下面是另一个原因,当你遇到错误信息,如 can't resolve symbol 'open64'can't resolve symbol 'setrlimit64' 时,你可能正在使用一个支持大文件的应用程序,并且正在一个不支持它的环境中使用。要注意 __USE_FILE_OFFSET64 宏。

2012-03-01 22:34:39
stackoverflow用户5529551
stackoverflow用户5529551

尝试删除这行代码:

export STRIP=$(TARGET_CROSS)strip
2015-11-05 14:04:52