gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:31:42 24 4
gpt4 key购买 nike

我已经构建了一个共享库(即 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 中缺少的任何想法。

最佳答案

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

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

关于makefile - 如何让我的应用程序独立于其位置链接库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9482984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com