【问题标题】:Passing relative path on OSX in C在 C 中传递 OSX 上的相对路径
【发布时间】:2016-01-22 06:25:22
【问题描述】:

我正在尝试制作一个在我的 Mac 上运行其文件夹中的可执行文件的程序。 考虑到我的程序与源代码 (/Users/Marcello/Documents/C/Test/Test/Test.c) 编译在同一文件夹中,该程序将如下所示:

int main(int argc, const char * argv[]) 
{

    printf("Hello, world!\n");

    if(execl("/Users/Marcello/Documents/C/Test/Test/HelloWorld", "HelloWorld", NULL))
        printf("ERROR\n");

    return 0;
}

如果我给出绝对路径,一切正常,但当我尝试将相对路径传递给文件夹时(传递 "HelloWorld" 而不是 "/Users/Marcello/Documents/C/Test/Test/HelloWorld"),它就不再工作了。

我注意到发生这种情况是因为在没有其他迹象的情况下,程序将尝试在 shell 文件夹而不是项目文件夹中搜索 HelloWorldfopen() 之类的函数也会发生这种情况,所以我尝试考虑解决方案;问题是,我想把这段代码放到一个程序中,每个人都可以下载并安装在任何他们喜欢的地方,我也希望它是跨平台的,但是我找到的所有解决方案,比如chdir(),以某种方式参考到程序的绝对路径,我不应该提前知道的。

谁能帮我找到一个长期的解决方案?

【问题讨论】:

  • 程序将以某个目录作为当前目录运行(您可以使用getcwd() 来查找该名称)。您可以绝对指定程序名称(您知道这是有效的),也可以相对于当前目录指定它——这意味着您需要知道程序相对于当前目录的位置。您可以使用execlp() 而不是execl(),这样您就可以只指定Helloworld 作为第一个参数,它会在您的$PATH 环境变量中列出的目录中找到。第一个调试步骤:打印来自getcwd() 的值。
  • 如何将PATH指定为项目文件夹?
  • 您从哪里运行此代码?在 XCode GUI 内部,还是从终端窗口中的命令行提示符,或其他地方?您通常会安排在已知位置安装程序(我的许多程序都保存在$HOME/bin,所以我将$HOME/bin 作为$PATH 中的(许多)目录之一。但我不会更改PATH经常动态地。我可能不会向它添加“项目文件夹”。我不知道如何回答你的问题来帮助你。你已经留下了足够多的未指定内容,我不确定你在做什么-或尝试做。
  • @JonathanLeffler 我不能使用固定绝对路径,因为我不是唯一一个从事该项目的人,我需要它也可以为下载的人工作并将其安装在他们喜欢的任何目录中。我之前发布的代码只是一个示例,我需要该函数的项目要复杂得多。为了回答你的问题,我从我的 shell 运行这个程序,它通常初始化为~/。我正在寻找的是一种直接链接到项目目录,或直接从程序本身获取项目目录路径的方法

标签: c macos path


【解决方案1】:

argv 的第一个元素包含您程序的相对路径。

【讨论】:

  • 是的,但是当前目录是shell的当前目录。不是项目的目录。
  • argv[0] 是否包含你想要的路径?
猜你喜欢
  • 2020-12-18
  • 2017-08-01
  • 2017-04-04
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多