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”
答案 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