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

时间:2011-01-25 13:46:53

标签: linux lua cross-compiling

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'

我没有足够的经验知道原因是什么,尽管Google似乎指出了共享库的问题。也许该模块需要一些库,或库的某些特定版本,它不存在?

之前有人见过这种错误吗?我怎么调查?

谢谢。


编辑:以下是我用于为SQLite3构建Lua,SQLite3和LuaSQL的config / 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”

4 个答案:

答案 0 :(得分:2)

我对lua没有任何经验,但总的来说我可以说当符号“未解析”时,这表明链接器无法在任何存档文件或库中找到符号链接在一起。您需要确定哪个库定义了符号并将其包含在link命令中,通常带有-l标志。您可能还需要提供一个-L标志,给出包含此库的目录。在Makefile中,您可以将这些标志添加到LDFLAGS变量。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

这是另一个原因,当您遇到无法解析符号'open64'或无法解析符号'setrlimit64'的错误时 - 您可能正在使用具有大文件支持的应用程序支持它。注意__USE_FILE_OFFSET64宏。

答案 3 :(得分:0)

尝试删除此行:

export STRIP=$(TARGET_CROSS)strip