假设我有main.lo
我希望链接到库foo.so
。链接器应始终在foo.so
处寻找/foo/bar/lib.so
(固定路径,不搜索),但我的主目录中只有lib.so
而不是/foo/bar/
中的/tmp
受保护的目录我不能写信给自己。
是否可以像这样链接lib?
修改:
以下是使用/foo/bar
代替void foo();
int main(){
foo();
return 0;
}
的简单示例。你能通过修改构建脚本来使它工作吗?
的main.c
#include <stdio.h>
void foo(){
puts("foo");
}
foo.c (多文件库被高估)
#!/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
build.sh
NOT IN
答案 0 :(得分:3)
您需要两个选项才能使其正常工作:
首先,您需要使用-L
选项告诉链接器目前库实际位于何处。
然后,您需要使用-rpath
链接器选项来确定最终位置的位置。不幸的是,这是一个linker-specific option,这意味着你需要使用-Wl
选项来加入GCC前端程序。
所以命令看起来应该像
$ gcc object.o files.o -o target \
-L/current/path/to/library -Wl,-rpath,/final/path/to/library -llibrary
请注意,这两条路径当然可以相同。