【问题标题】:Execute C++ executable by double-click on Linux/MacOS在 Linux/MacOS 上双击执行 C++ 可执行文件
【发布时间】:2018-09-26 08:17:52
【问题描述】:

我编写了一个 C++ 软件,它需要从它所在的文件夹中读取文件,而不是在同一文件夹中写入其他文件。

目前我通过 shell 导航到复制可执行文件的文件夹,然后使用./executable_name 启动它。

我想通过双击来执行它。如果我这样做软件告诉我它找不到输入文件,那么它就像它没有在好文件夹中执行一样。

在我看来有两种方法: 1)继续复制工作文件夹中的可执行文件并告诉它在此文件夹中查找文件。 2) 创建一个 bash 脚本,调用给定文件夹(如应用程序)中的可执行文件,并将此脚本复制到工作文件夹中。然后告诉脚本执行软件,就像它在工作文件夹中一样。 3) 你可能有更好的想法

无论如何我都不知道该怎么做。

有人可以帮帮我吗?

非常感谢!!

【问题讨论】:

  • 我猜你的应用没有考虑到cwd() 并且忘记了chdir() 到它的预期工作目录。
  • 确实如此。你能再解释一下吗?比如……我该怎么做?谢谢
  • 首先阅读我提到的两个函数的man 页面。另请阅读:stackoverflow.com/questions/933850/…
  • 您的应用还不是为 GUI 交互而设计的。很难回答,因为它在很大程度上取决于您要使用的框架。反正有很多这样的问题,比如看unix.stackexchange.com/questions/32797/…
  • 你可以让它在启动时打印它当前的工作目录,如果需要的话,你可以使用一些函数来确定它自己的位置。但是如何通过双击linux中的可执行文件来运行呢?

标签: c++ linux macos directory executable


【解决方案1】:

在 linux 上,您可以将 -no-pie 标志添加到您的 g++ 编译器。

g++ main.cpp -o main -no-pie

diference between compiling with -no-pie and without it

这对于在终端上不显示任何内容的图形应用程序更有用。如果这是你的情况,那就继续做吧。
这将生成一个可执行文件,您可以双击执行。

【讨论】:

    【解决方案2】:

    “双击执行”对于进程工作目录(pwd)来说是一个非常模糊的操作。如果通过图形文件管理器启动的可执行文件的 (pwd) 应该是文件管理器中当前选择的目录,还是应该是启动文件管理器的目录,则没有严格的规定。

    解决问题的唯一干净方法是将程序注册为在目录上操作的文件类型处理程序,以便它显示在目录的上下文菜单中 (https://www.freedesktop.org/wiki/Specifications/mime-apps-spec/)。附带说明一下,让您的程序能够将目标目录作为命令行参数并在内部进行目录更改可能是一个好主意。

    注册为文件类型处理程序有一个很好的副作用,即您可以将程序的单个副本保存在中心位置,而无需复制任何内容。

    【讨论】:

      【解决方案3】:

      大多数桌面软件应执行程序,并将当前工作目录 (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.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-06
        • 2021-02-14
        • 2018-06-22
        • 2012-02-25
        • 2021-12-26
        • 2015-08-21
        • 1970-01-01
        • 2014-02-09
        相关资源
        最近更新 更多