C++ Teamviz符号链接

C++ Teamviz符号链接,c++,std,symlink,stdstring,C++,Std,Symlink,Stdstring,最近我下载了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():

最近我下载了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相关文件

启动它的正确方式是存根脚本,而不是符号链接,例如:

#!/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
$cat for_reals.c
#包括
#包括
int
主(内部argc,字符**argv)
{
char realdest[1024];
realpath(argv[0],realdest);
printf(“%s\n”,realdest);
返回0;
}
$make for_reals
抄送为_reals.c-o为_reals
美元/欧元
/用户/petesh/开发/实验/for_reals/for_reals
$ln-fs为_reals charlie
美元/查理
/用户/petesh/开发/实验/for_reals/for_reals