【问题标题】:How can I make my application to link libraries independent of its location?如何使我的应用程序独立于其位置来链接库?
【发布时间】:2012-03-17 23:40:26
【问题描述】:

我已经构建了一个共享库(即libabc.so)和一个使用我的共享库的可执行文件(即myapp)。我已经将共享库和我的可执行文件都放在了我的文件系统中,但是当我运行我的可执行文件时,它给了我以下错误

error while loading shared libraries: <target_lib_path>/<mylib>.so cannot open shared object file: No such file or directory.

现在我的开发环境是我有一个不同的目标文件系统,它在构建我的共享库后放置在~/targetfs,我将它安装在~/targetfs/usr/local/abc/lib 中。在链接我的应用程序期间,我给它

LDFLAGS += -L~/targetfs/usr/local/abc/lib 

我的应用程序构建良好。但是当我在~/targetfs 是我的文件系统的环境中运行我的应用程序时,我的应用程序会抱怨 加载共享库时出错:

/home/user/targetfs/usr/local/abc/lib/libabc.so: can not open shared object file. No such file or directory exist.

现在,当然我的应用程序正在搜索不存在的共享库的路径,但我希望我的应用程序独立于该路径,而是应该在/lib/usr/lib 中查找我的共享库、/usr/local/libLD_LIBRARY_PATH 位置。

如何让我的应用程序独立于其位置链接库?

我的共享库和应用程序的 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) 

--------- 应用程序生成文件(省略不必要的信息)

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

任何想法我的 Makefile 中缺少什么。

【问题讨论】:

    标签: makefile shared-libraries


    【解决方案1】:

    您可以要求链接器将多个搜索路径放入二进制文件中。您可以使用 -Wl,rpath=... 选项引入这些搜索路径。

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

    【讨论】:

    • 也可以提及$ORIGIN
    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多