2012-02-28 166 views
4

我構建了一個共享庫(即libabc.so)和一個使用我的共享庫的可執行文件(即myapp)。我已經把兩者的共享庫和可執行我在我的文件系統,但是當我運行我的可執行程序,它給了我下面的錯誤加載共享庫時出錯

錯誤而載入共享庫:/.so無法打開共享對象文件:沒有這樣的文件或目錄。

現在我的開發環境是在建立我的共享庫之後,在(〜/ targetfs/usr/local/abc/lib)中安裝它之後,我有一個不同的目標文件系統,它位於(〜/ targetfs)。在鏈接我的應用程序給它

LDFLAGS + = -L〜/ targetfs在/ usr /本地/ ABC/lib目錄

我的應用程序建立的罰款。但是當我在(〜/ targetfs)是我的文件系統的環境中運行我的應用程序時,我的應用程序在加載共享庫時抱怨 錯誤:/home/user/targetfs/usr/local/abc/lib/libabc.so:can沒有打開共享對象文件。沒有這樣的文件或目錄存在。

當然,我的應用程序正在搜索不存在的共享庫的路徑,但我希望我的應用程序獨立於此路徑,而應該在/ lib,/ usr/lib,/ usr/local/lib或LD_LIBRARY_PATH位置。

所以,問題是「我怎樣才能讓我的應用程序鏈接獨立於其位置的庫?」我的共享庫&應用

Makefile文件如下。

--------------共享庫makefile。 (省略非必要的信息)

CC    = $(CROSS_COMPILE)gcc 
CFLAGS   = -Wall -shared -fpic 
LDFLAGS   = -Xlinker --gc-sections --allow-shlib-undefined 
LIBRARY   = libabc.so 
OBJ_DIR   = obj 
SRC_DIR   = src 
CHK_DIR_EXISTS = test -d 
MKDIR   = mkdir -p 

# Project Source Files 
C_SOURCES += $(SRC_DIR)/abc.c 
OBJECTS += $(OBJ_DIR)/abc.o 
INCLUDES += -Iinc        
$(LIBRARY): $(OBJECTS) 
    @echo "" 
    @echo "Linking..." $(LIBRARY) 
    @$(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) -o $(OBJ_DIR)/$(LIBRARY) 

----------應用程序的Makefile(省略非必要的信息)

LDFLAGS += $(TARGETFS)/usr/local/abc/lib/libabc.so   \ 
     -lpthread -lrt 

任何想法有什麼遺漏在我的Makefile文件。

問候, 法魯克艾爾沙德。

回答

4

您可以要求鏈接器將多個搜索路徑放入二進制文件中。您可以使用-Wl,rpath = ...選項引入這些搜索路徑。

gcc -o abc abc.c 
-L~/targetfs/usr/local/abc/lib 
-labc 
-Wl,-rpath=/usr/local/abc/lib 
-Wl,-rpath=... 
-Wl,-rpath=... 
+0

感謝。問題解決了 – 2012-02-28 14:19:41