【问题标题】:Xcode 7: how to set PATH variable?Xcode 7:如何设置 PATH 变量?
【发布时间】:2017-01-09 03:26:00
【问题描述】:

我有一个用 Xcode 7 编写的 c 代码,并在运行 El Capitain (OSX 10.11.6) 的 Mac 笔记本电脑上运行。该程序使用以下代码行调用另一个程序“bertini”:

eflag = execvp("bertini", "input");

或者

system("bertini input");

在我升级操作系统之前,这两个都运行良好(我运行的是 Xcode 3 或 4,我不记得了。)现在程序不再运行,因为它找不到程序 bertini。

我发现问题在于 bertini 不在搜索路径上,因为在 El Capitain 中,不允许我将可执行文件复制到 /usr/bin/。因此,请按照此页面上的说明进行操作: http://forums.appleinsider.com/discussion/189702/cant-copy-file-to-usr-bin-even-when-logged-in-as-root,

我将 bertini 可执行文件移动到我选择的文件夹中,并将 ~/.bash_profile 更改为指向该文件夹。现在 bertini 在终端中运行得很好,但在我的程序调用它时就不行了。

在 Xcode 中运行时,我到底如何才能找到程序找到 bertini 的当前位置?我尝试输入完整目录(/path/to/directory/ contains/bertini/bertini),但这仍然不起作用。我也尝试过遵循以前版本的 Xcode 的说明(例如,在这个问题 where is $PATH set in xcode? 中),但似乎 Xcode 的版本非常不同,我不明白如何调整这些说明。此外,关于设置~/.MacOSX/environment.plist 的响应中的链接已损坏,我对更改以“。”开头的文件感到紧张。不知道自己在做什么(我对此了解不多)。

请注意,这是为了学术研究,而不是一般用途,所以如果我可以让它只在我的机器上工作(嗯,两台机器),那很好。

【问题讨论】:

    标签: xcode macos path xcode7 osx-elcapitan


    【解决方案1】:

    首先我需要说您使用 execvp 的代码示例看起来不正确,实际上不应该编译。你的意思可能是这样的

    char *const argvector[] = { (char *const)"bertini", (char *const)"input", NULL };
    eflag = execvp("bertini", argvector);
    

    eflag = execlp("bertini", "bertini", "input", (char *)0);
    

    好的,现在开始解决您的问题。至少有两种基本方法可以让事情顺利进行。一种是指定在 exec 调用中放置“bertini”的位置的完整路径,如以下使用 execvp 的示例:

    char *const argvector[] = { (char *const)"bertini", (char *const)"input", NULL };
    eflag = execvp("/full/path/to/bertini", argvector);
    

    exec 函数的手册页 (man 3 exec) 指定仅当作为“file”参数传入的字符串中没有任何“/”字符时才搜索路径。因此,如果它存在于指定的完整路径中,上面会忽略路径并启动“bertini”。这可能是最简单的方法,它也适用于旧版本的 MacOS。

    但是,如果出于某种原因您希望包含搜索路径,您可以使用 launchctl shell 命令确保从 Finder 启动的应用程序的路径使用特定的搜索路径,如下文所述 -

    Environment variables in Mac OS X

    只要下命令

    launchctl setenv PATH $PATH
    

    在 ~/.bash_profile 中,无论您在何处更新路径以包含“bertini”的新位置,然后(这很重要)您需要重置 Finder 以吸收这些新信息。我认为注销并再次登录会这样做,但如果我错了,请尝试重新启动。现在从命令行启动的所有应用程序都将使用您更新后的路径,并且原来的“系统”调用应该可以工作了。

    只是一个临别评论。 /usr/local/bin 是在以后的 MacOS 版本(不允许更改 /usr/bin 的版本)上放置东西的好地方。它甚至可能位于 Finder 启动的应用程序使用的默认路径上。只需再尝试一件事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2014-07-30
      • 2014-02-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多