GNU/Linux下使用gcc编译共享库的问题及解决
主问题
在GNU/Linux环境下,我将C代码编译为共享库bin/libcore.so,并在生成可执行文件bin/test时链接该库。文件均已成功生成,但运行bin/test时出现以下错误:
bin/test: error while loading shared libraries: libcore.so: cannot open shared object file: No such file or directory
子问题
我推测该问题可能需要在编译bin/test时添加-Wl,-rpath,bin参数(Windows环境下我曾通过设置-Wl,-out-implib,bin/libcore.dll.a解决过类似问题),但在尝试过程中遇到了新问题:
我通过以下命令向Makefile传递LDFLAGS参数:
make -f build/Makefile PLATFORM="linux" \ TARGET="bin/libcore.so" \ LDFLAGS="-shared" \ ... \
在build/Makefile中,我编写了如下引用LDFLAGS的代码:
# Linker flags. ifeq ($(PLATFORM),linux) LDFLAGS += -Wl,-rpath,bin endif ifeq ($(suffix $(TARGET)),.dll) LDFLAGS += -Wl,--out-implib,$(dir $(TARGET))lib$(basename $(notdir $(TARGET))).dll.a endif # Build target. $(TARGET): $(OBJ_FILES) $(CC) -o $@ $^ $(LDFLAGS)
但执行Makefile时出现错误:
LDFLAGS += -Wl,-rpath,bin make[1]: LDFLAGS: No such file or directory
解决方案
问题根源在于Makefile的语法错误,同时我将rpath从bin改为$$ORIGIN,避免了路径相关的潜在问题。以下是可正常工作的Makefile代码:
# Additional linker flags. EXTRA_LDFLAGS := ifeq ($(PLATFORM),linux) EXTRA_LDFLAGS := -Wl,-rpath,'$$ORIGIN' endif ifeq ($(suffix $(TARGET)),.dll) EXTRA_LDFLAGS := -Wl,--out-implib,$(dir $(TARGET))lib$(basename $(notdir $(TARGET))).dll.a endif # Build target. $(TARGET): $(OBJ_FILES) $(CC) -o $@ $^ $(LDFLAGS) $(EXTRA_LDFLAGS)
内容的提问来源于stack exchange,提问作者Oh Fiveight
相关产品推荐
相关产品推荐

