假设我有一个 main.lo
,我想将其链接到库 foo.so
。链接器应该始终在 /foo/bar/lib.so
查找 foo.so
(固定路径,无需搜索),但我只有 lib.so
在我的主目录中,而不是在 /foo/bar/
中,这是一个 protected 目录,我无法向自己写入内容。
是否可以像这样链接库?
编辑:
下面是一个使用 /tmp
而不是 /foo/bar
的简单示例。您可以通过修改构建脚本使其工作吗?
main.c
void foo();
int main(){
foo();
return 0;
}
foo.c(多文件库被高估了)
#include <stdio.h>
void foo(){
puts("foo");
}
build.sh
#!/bin/sh
set -x
gcc -c -fPIC main.c -o main.lo
gcc -c -fPIC foo.c -o foo.lo
gcc -shared -o foo.so foo.lo
gcc -o pwd main.lo "$PWD/foo.so"
rm -f /tmp/foo.so
#? Link into dest, against /tmp/foo.so but use "$PWD/foo.so"
cp -a foo.so /tmp/foo.so
echo pwd:
./pwd #this works
echo dest:
./dest
最佳答案
您需要两个选项才能使其工作:
首先,您需要使用 -L
选项告诉链接器当前库的实际位置。
然后您需要使用 -rpath
链接器选项来告知最终位置。不幸的是,这是一个 linker-specific option这意味着您需要在 GCC 前端程序中使用 -Wl
选项。
所以命令应该类似于
$ gcc object.o files.o -o target \
-L/current/path/to/library -Wl,-rpath,/final/path/to/library -llibrary
请注意,这两个路径当然可以相同。
关于c - 从与预期最终位置不同的位置链接共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36443842/