我编写了一个C ++软件,需要从它所在的文件夹中读取文件,而不是将其他文件写入同一文件夹。
目前我通过shell导航到我复制可执行文件的文件夹,然后用./executable_name
启动它。
我想通过双击执行它。如果我这样做,软件告诉我它找不到输入文件,那就好像它没有在好的文件夹中执行。
在我看来,有两种方法: 1)继续复制工作文件夹中的可执行文件,并告诉它查找该文件夹中的文件。 2)创建一个bash脚本,调用给定文件夹中的可执行文件,如应用程序,并将此脚本复制到工作文件夹中。然后告诉脚本执行软件,就好像它在工作文件夹中一样。 3)你可能有更好的想法
在任何情况下,我都不知道如何做到这一点。
有人可以帮帮我吗?
非常感谢!!
答案 0 :(得分:0)
大多数桌面软件应执行程序,并将当前工作目录(CWD)设置为可执行文件的位置。大多数还支持桌面链接或程序快捷方式,允许您自己设置CWD。这可能是最简单的路线,但它取决于您正在运行的桌面环境。
您的下一个选择是编写一个shell脚本/批处理文件,在其自己的目录中执行您的程序:
#!/bin/sh
cd /path/to/program
./myprogram
然后从桌面执行该操作,而不是直接执行可执行文件。
最后,您可以使程序本身与CWD无关。为此,您需要在将路径传递给系统调用的任何位置添加路径解析代码。首先,您需要知道可执行文件的位置。在C ++ but there are platform-specific ways中没有符合标准的方法。知道该路径后,就可以解析该基本路径的所有相对路径。 StackOverflow上有几个关于如何做到这一点的问题; here's a place to start
答案 1 :(得分:0)
“双击执行”是一个非常模糊的操作,与进程工作目录(pwd)有关。如果通过图形文件管理器启动的可执行文件的(pwd)应该是文件管理器中当前选择的目录,或者它应该是文件管理器的启动目录,则没有严格的规范。
解决问题的唯一简洁方法是将程序注册为对目录进行操作的文件类型处理程序,以便它显示在目录(https://www.freedesktop.org/wiki/Specifications/mime-apps-spec/)的上下文菜单中。另外,让程序能够将目标目录作为命令行参数并在内部进行目录更改,这可能是一个好主意。
注册为文件类型处理程序具有很好的副作用,您可以将程序的单个副本保存在中心位置,而无需复制内容。
答案 2 :(得分:0)
在 linux 上,您可以将 -no-pie
标志添加到您的 g++ 编译器。
g++ main.cpp -o main -no-pie
diference between compiling with -no-pie and without it
这对于在终端上不显示任何内容的图形应用程序更有用。如果这是你的情况,那么就去做吧。
这将生成一个可执行文件,您可以双击它来执行。