我已经构建了一个共享库(即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
中查找我的共享库,{ {1}},/usr/lib
或/usr/local/lib
位置。
如何让我的应用程序链接库而不依赖于它的位置?
Makefiles for my shared library&amp;申请如下。
--------------共享库makefile。 (省略不必要的信息)
LD_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)
我的Makefiles中缺少什么想法。
答案 0 :(得分: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=...