gcc中的-Wl,rpath=<your_lib_dir>选项

本文详细解释了GCC编译链接动态库时的问题,即-L选项只在编译时有效,导致执行时找不到库。提供了解决方法:通过-Wl,rpath=<your_lib_dir>使可执行文件记住链接库的位置。并给出了解决问题的参考链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gcc编译链接动态库时,很有可能编译通过,但是执行时,找不到动态链接库,那是

因为-L选项指定的路径只在编译时有效,编译出来的可执行文件不知道-L选项后面的值,

当然找不到。可以用ldd <your_execute>看看是不有 ‘not found’在你链接的库后面,

解决方法是通过-Wl,rpath=<your_lib_dir>,使得execute记住链接库的位置

 

参考链接

http://gcc.gnu.org/ml/gcc-help/2005-12/msg00017.html

VERSION_MAJOR = 1 VERSION_MINOR = 0 VERSION_PATCH = 0 LIB_VERSION = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH) COMPILE_DIR = /opt/M300_V5.0_kernel4.4.94/prebuilts/toolchains/mips-gcc720-glibc229 COMPILE = $(COMPILE_DIR)/bin/mips-linux-gnu- GCC = $(COMPILE)gcc ALG_PATH = ./thirdpart LD_RUN_PATH = -Wl,-rpath=$(ALG_PATH) # 编译选项增加-fPIC和-shared CFALGS = $(INCLUDE) CFALGS += -g CFALGS += -fPIC # 生成位置无关代码 CFALGS += -Wall CFALGS += $(LD_RUN_PATH) CFALGS += -L./thirdpart # 链接选项单独定义 LDFLAGS = -shared # 生成共享库 LDFLAGS += -Wl,-soname,libp2501_keyindex.so.$(VERSION_MAJOR) # 设置主版本soname LDFLAGS += -lm LDFLAGS += -lpthread LDFLAGS += -ldl LDFLAGS += -l0405 LDFLAGS += -lgmssl OBJPATH = ./ \ src/base64/ \ src/cjson/ \ src/log/ \ src/tools/ \ src/queue/ \ src/shm/ \ src/hostapi/ SRC_C = $(foreach dir, $(OBJPATH), $(wildcard $(dir)*.c)) OBJS_FILE_OBJ = $(patsubst %.c, %.o, $(SRC_C)) VPATH := $(OBJPATH) INCLUDES = include/ \ include/base64/ \ include/cjson/ \ include/log/ \ include/tools/ \ include/queue/ \ include/shm/ \ include/hostapi/ INCLUDE = $(patsubst %, -I %, $(INCLUDES)) CLEAN_DIR = $(foreach dir, $(OBJPATH), $(wildcard $(dir)*.o)) # 修改目标为带版本号的动态库 TARGET = libp2501_keyindex.so.$(LIB_VERSION) .PHONY: build clean build: $(OBJS_FILE_OBJ) # 生成带版本号的动态库并创建符号链接 $(GCC) $(OBJS_FILE_OBJ) -o $(TARGET) $(CFALGS) $(LDFLAGS) ln -sf $(TARGET) libp2501_keyindex.so.$(VERSION_MAJOR) ln -sf libp2501_keyindex.so.$(VERSION_MAJOR) libp2501_keyindex.so clean: # 清理生成的文件和符号链接 $(RM) ./$(TARGET) $(RM) libp2501_keyindex.so.$(VERSION_MAJOR) $(RM) libp2501_keyindex.so for n in $(CLEAN_DIR); do rm -rf $$n; done %.o: %.c # 编译时添加-fPIC $(GCC) -c $< -o $@ $(CFALGS)编译成库后其他程序调用的使用方法
04-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值