最近我下载了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运行它,一切顺利。
我做错了什么以及如何解决(我或问题)? 提前谢谢。
答案 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