2012-02-28 121 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