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

标签 c linux gcc

假设我有一个 main.lo,我想将其链接到库 foo.so。链接器应该始终在 /foo/bar/lib.so 查找 foo.so (固定路径,无需搜索),但我只有 lib.so 在我的主目录中,而不是在 /foo/bar/ 中,这是一个 protected 目录,我无法向自己写入内容。

是否可以像这样链接库?

编辑: 下面是一个使用 /tmp 而不是 /foo/bar 的简单示例。您可以通过修改构建脚本使其工作吗?

ma​​in.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/

相关文章:

regex - 在正则表达式中使用带有换行符的 sed

linux - https ( SSL ) 的 curl 命令

c - 将 GDB 与 OpenMP 结合使用

gcc - isnan的源代码在哪里?

c - C 中未遇到文件结尾 (eof)

c++ - 在eclipse中启动C Cpp的新项目时出错

c - while循环中的scanf无法输入任何内容

c - 如何使用 C 在 Windows 中创建可中断 sleep ?

linux - 只计算其中有单词的行

c - Microsoft C 偏离标准