2011-01-25 61 views
1

Lua中,測試模塊,和現實生活中的模塊的交叉編譯就OK,但是當我加載現實生活中的模塊上運行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似乎指出了共享庫的問題。也許模塊期望某個庫,或某個特定版本的庫,它不在那裏?

有人看到過這種類型的錯誤嗎?我怎麼調查?

謝謝。


編輯:這是我用來構建Lua中,sqlite3的,並LuaSQL爲SQLite3的配置/ Makefile文件:

# 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 [email protected] $(CFLAGS) $(LDFLAGS) $(LUA_O) $(LUA_A) 

$(LUAC_T): $(LUAC_O) $(LUA_A) 
     $(CC) -o [email protected] $(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 [email protected] -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 [email protected] $(OBJS) $(DRIVER_LIBS) $(LIB_OPTION) 

編輯:被告知後,這是最有可能是並且在更多的閱讀和試​​驗/錯誤之後,我終於發現它是什麼:當構建Lua時,需要以下選項:「-Wl,-E」

+1

提供你如何編譯和鏈接模塊和Lua的交叉編譯環境將有助於命令行。 – 2011-01-25 14:19:35

+0

對不起。我編輯了原文。 – Gulbahar 2011-01-25 15:45:31

回答

2

我對lua沒有任何經驗,但總的來說我可以說當符號爲「未解析」時,這表示鏈接器無法在任何存檔文件或庫中找到它被告知鏈接在一起的符號。您需要確定哪些庫定義了該符號並將其包含在鏈接命令中,通常使用-l標誌。您可能還需要提供一個-L標誌,指明包含此庫的目錄。在你的Makefile,你可以將這些標誌添加到LDFLAGS變量。

2

除了上面的回答,如果您是在設備上運行,你必須確保你沒有鏈接對包括或您的構建系統上庫。您的開發系統$ PATH變量可能指向本地包含文件和庫。另外,您需要確保這些庫位於設備中的可用位置,通常位於/ bin或/ lib中。

2

這是另外一個原因,當你遇到像無法解析符號'open64'或無法解析符號'setrlimit64'的錯誤時 - 你可能正在使用一個應用程序,不支持它。注意__USE_FILE_OFFSET64宏。

0

嘗試刪除這一行:

export STRIP=$(TARGET_CROSS)strip