C++ Teamviz符号链接
最近我下载了TeamViz(前Pomodoro应用程序)。它不可安装,所以我只运行可执行文件。/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():
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