Teamviz符号链接

时间:2014-08-21 12:27:03

标签: c++ std symlink stdstring

最近我下载了TeamViz(前番茄钟应用程序)。它不可安装,所以我只运行可执行文件./Teamviz并且它可以工作。 我希望它从终端运行。所以我做了什么

sudo mv TeamViz /opt
sudo ln -s /opt/TeamViz/TeamViz /usr/bin/teamviz

当我输入teamviz时,我收到此错误

terminate called after throwing an instance of 'std::logic_error'
what():  basic_string::_S_construct null not valid
Aborted (core dumped)

然而,如果我通过./TeamViz运行它,一切顺利。

我做错了什么以及如何解决(我或问题)? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

TeamViz最有可能尝试查找与运行相关的信息。在这种情况下,它(最有可能)在/usr/bin中查找TeamViz相关文件。

启动它的正确方法是存根脚本,而不是符号链接,例如类似的东西:

#!/bin/bash -p
exec /opt/TeamViz/TeamViz "$@"

作为可执行文件放置/usr/bin/TeamViz

对于“自托管”的应用程序来说,这个问题并不罕见。

通常,应用程序使用dirname(argv[0])来确定它正在运行的目录而不是dirname(realpath(argv[0])),因此错误检测它的启动目录,就像符号链接所在而不是真实二进制文件所在的位置。这方面的一个例子如下:

$ cat for_reals.c 
#include <stdlib.h>
#include <stdio.h>

int
main(int argc, char **argv)
{
    char realdest[1024];

    realpath(argv[0], realdest);

    printf("%s\n", realdest);
    return 0;
}
$ make for_reals
cc     for_reals.c   -o for_reals
$ ./for_reals 
/Users/petesh/Development/experiments/for_reals/for_reals
$ ln -fs for_reals charlie
$ ./charlie
/Users/petesh/Development/experiments/for_reals/for_reals