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

Far*_*had 4 makefile shared-libraries

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

error while loading shared libraries: <target_lib_path>/<mylib>.so cannot open shared object file: No such file or directory.
Run Code Online (Sandbox Code Playgroud)

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

LDFLAGS += -L~/targetfs/usr/local/abc/lib 
Run Code Online (Sandbox Code Playgroud)

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

/home/user/targetfs/usr/local/abc/lib/libabc.so: can not open shared object file. No such file or directory exist.
Run Code Online (Sandbox Code Playgroud)

现在,当然路径我的应用程序正在寻找不存在的共享库,但我想我的应用程序是独立的这条道路的,而是应该寻找我的共享库/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) 
Run Code Online (Sandbox Code Playgroud)

----------应用程序Makefile(省略不必要的信息)

LDFLAGS += $(TARGETFS)/usr/local/abc/lib/libabc.so           \
       -lpthread -lrt
Run Code Online (Sandbox Code Playgroud)

任何想法我的Makefiles中缺少什么.

sve*_*nfx 5

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

gcc -o abc abc.c 
-L~/targetfs/usr/local/abc/lib 
-labc 
-Wl,-rpath=/usr/local/abc/lib 
-Wl,-rpath=...
-Wl,-rpath=...
Run Code Online (Sandbox Code Playgroud)