最近我下载了TeamViz(前pomodoro应用程序)。它是不可安装的,所以我只是运行可执行文件。/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,一切都很顺利。
我做错了什么,如何解决它(我或问题)?
TeamViz最有可能试图找到与运行它有关的信息。在这种情况下,它(最有可能)在/usr/bin
中查找与TeamViz相关的文件。
正确的启动方式是一个stub脚本,而不是一个符号链接,例如:
#!/bin/bash -p
exec /opt/TeamViz/TeamViz "$@"
放置为可执行/usr/bin/TeamViz
.
在应用程序中设置"self host"是很常见的。
通常应用程序使用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("%sn", 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