这件事困扰了我一段时间我试着在我的一个项目中将一个共享对象链接到一个可执行文件( struct 如下):
.
├── lib.c
├── lib.h
├── main.c
└── Makefile
...使用此生成文件:
CC != if command -v clang; then continue; elif command -v gcc; then continue; else echo c99; fi
.PHONY: build
build: main
./main
lib.so: lib.c
$(CC) -shared -fPIC -o lib.so lib.c
main: main.c lib.so
$(info Building executable: "main")
$(CC) -o main main.c lib.so
...但是我收到了这个错误:./main: error while loading shared libraries: lib.so: cannot open shared object file: No such file or directory
我确实找到了一些现有的解决方案,包括使用LD_LIBRARY_PATH
变量或-Wl,-rpath=path/to/dir
编译标志,但让我们说,我想用另一种方法来解决这个问题.
我知道,听我说完.我已经能够成功地运行链接到层次 struct 中的共享对象的二进制文件,如下所示:
.
├── bin/
│ └── main
├── lib/
│ └── lib.so
├── src/
│ ├── lib.c
│ ├── lib.h
│ └── main.c
└── Makefile
...而且我不需要使用这两种方法.在上面的示例中,我还对二进制文件使用了ldd
:
$ ldd bin/main
linux-vdso.so.1 (0x00007ffec55e7000)
lib/lib.so (0x00007f3198a7f000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f3198876000)
/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f3198a8b000)
与麻烦的二进制代码相比:
$ ldd main
linux-vdso.so.1 (0x00007ffc2de5f000)
lib.so => not found
libc.so.6 => /usr/lib/libc.so.6 (0x00007880524c3000)
/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007880526d3000)
虽然我可能在这里做了一个假设,但我不会假装我还没有找到这个问题的答案.在我发布这个问题后不久,我将发布我自己的解决方案.