从与预期最终位置不同的位置链接共享库

时间:2016-04-06 07:06:57

标签: c linux gcc

假设我有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

1 个答案:

答案 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

请注意,这两条路径当然可以相同。