主要问题
我在 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
子问题
将其分离成一个单独的问题,因为它可能完全偏离了正确的轨道。
我读到我的问题可能是因为我需要-Wl,-rpath,bin
在构建时进行设置bin/test
(我必须经历类似的过程才能使其在 Windows 上工作,即设置-Wl,-out-implib,bin/libcore.dll.a
)。
我LDFLAGS
通过以下方式传递给我的 Makefile:
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
而$$ORIGIN
不是 ,bin
以避免答案中描述的问题。以下是可以运行的 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)