在带有符号链接的可执行文件中使用相对路径

Posted

技术标签:

【中文标题】在带有符号链接的可执行文件中使用相对路径【英文标题】:Using a relative path in executable with symbolic link 【发布时间】:2017-06-11 15:19:30 【问题描述】:

我试图弄清楚如何在 ubuntu 中使用我的应用程序和链接。我已经编译了代码,它包含某些文件的相对路径。当我在不同目录中创建指向可执行文件的链接时,我无法使用这些路径。有没有办法(在我的代码或链接的创建中)使它与相对路径一起工作?

谢谢

【问题讨论】:

链接与使用完整或相对路径调用应用程序没有什么不同。当前工作目录与您的应用程序的位置不同。在 Unix 操作系统中,通常在用户目录或已知完整路径下的某个特定位置有文件,有关详细信息,请参阅 Unix(类似)文件系统文档。大阅读:refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html 在编写 shell 脚本时,从不同目录调用 shell 脚本时会出现类似的问题。这个问题可以通过在运行任何命令之前先切换到脚本目录来解决。在 bash 中,参数 0 是脚本的名称。由于您使用的是已编译的程序,因此我不熟悉如何完成此操作。也许这会有所帮助***.com/questions/59895/… 【参考方案1】:

你要的是realpath吗?像这样的东西(下面例子中test的来源):

#include <iostream>
#include <cstdlib>

int main(int argc, char *argv[])

        char *path = realpath(argv[0], NULL);
        std::cout << path << '\n';
        free(path);
        return 0;

示例执行:

$ ln -s tmp/test
$ ./test
/home/mlil/tmp/test
$

【讨论】:

【参考方案2】:

在linux中:

ln -sr <source relative path> <destination relative path>

您可以通过导航到该目录并键入命令来验证在目标中创建的符号链接:

ls -l

如果它是可执行文件,则应使用可接受的答案,这就是您的问题所在。如果在可执行文件之外,这是一个快速简单的解决方案。

【讨论】:

以上是关于在带有符号链接的可执行文件中使用相对路径的主要内容,如果未能解决你的问题,请参考以下文章

linux内核模块中fd inode的可执行路径

QT如何修改编译后产生的可执行文件的路径》

由于调试符号,巨大的可执行文件,为啥?

GCC链接器:在指定部分移动符号

带注释的可执行文件反汇编

使用 cron 运行脚本的正确方法?