【问题标题】:using a Makefile in Xcode - or alternative IDE在 Xcode 或替代 IDE 中使用 Makefile
【发布时间】:2020-03-29 20:19:01
【问题描述】:

我是 Xcode、Makefile 和一般编程的新手。

我已经获得了使用 Makefile 构建的现有 C++ 代码。使用 Makefile,我可以毫无问题地在我的 Mac (MacOS 10.14.6) 上构建和运行可执行文件。

Makefile 的开头是

CC = g++-mp-9 -Wall -O2 -std=c++14 -fopenmp
DEBUG = 
CFLAGS = -c $(DEBUG) -I/opt/local/include
LFLAGS = $(DEBUG) -L/opt/local/lib -framework Accelerate -march=native -lfftw3 -lfftw3_threads -lopenblas -lm -lpthread -larmadillo

myproj: $(OBJS)
    $(CC) -o myproj $(OBJS) $(LFLAGS)

main.o: main.cpp const.h functions.h
    $(CC) $(CFLAGS) main.cpp
...

myproj 是生成的可执行文件。

我想使用 Xcode 11(或任何现代 IDE - 请参阅下面的 ALTERNATIVELY)的调试功能来探索和学习我想使用的代码。在these instructions 之后,我创建了一个命令行 Xcode 项目并设置了一个外部构建目标。

但是,当我尝试在 Xcode 中构建它时,我收到以下错误

g++-mp-9 -Wall -O2 -std=c++14 -fopenmp -c  -I/opt/local/include main.cpp
make: g++-mp-9: No such file or directory
make: *** [main.o] Error 1

这很奇怪,因为我的 Makefile 工作得很好,而且在命令行我的系统可以找到编译器:

>$ whereis gcc  
/usr/bin/gcc

谁能解释一下为什么 Xcode 找不到编译器,以及我该如何解决它? (此外,任何关于使用 Xcode 来理解设计为使用 Makefile 构建的代码的提示/警告都将不胜感激!)

交替
我并不热衷于使用 Xcode,我只是认为这很自然,因为我正在使用 Mac。如果有另一个带有良好调试器的 IDE 更适合使用 Makefile 构建命令行可执行文件,请告诉我!

【问题讨论】:

  • 请注意,gccg++-mp-9 不同,因此whereis gcc 没有失败这一事实与您遇到的错误无关。你想使用whereis g++-mp-9
  • 啊,好吧,>$ whereis g++-mp-9 什么也没给我返回,这表明它不在我的系统上。这使得我的 Makefile 成功编译代码的事实更加奇怪!
  • 并不是说它不在您的系统上的任何地方。就是它不在whereis 知道要查找的任何目录中。 whereis 在 MacOS 上是一个非常有限的命令。您应该尝试类似 POSIX 标准 command -v g++-mp-9 或特定于 bash 的 type -a g++-mp-9。我对 MacOS 或 Xcode 都不太了解:我不喜欢这两个系统。但是我想你的 shell 很可能正在设置 PATH 以便能够在 Xcode 没有以这种方式设置时找到这个编译器。也许它不会读取您的交互式 shell 配置或其他内容。
  • 哦,这很有用,谢谢。 type 命令揭示了通往g++-mp-9 的正确路径。看起来这是在bash_profile 中设置的(当我port installed 编译器时,通过MacPorts 自动添加的一行)。所以正如你所说,我可能需要了解如何将PATH 从 shell 导出到 Xcode。谢谢!

标签: xcode gcc makefile ide


【解决方案1】:

感谢 MadScientist 的帮助,我发现了PATH 环境变量没有从 bash (see also here) 导入的问题。经过反复试验,我发现我需要在 Build Settings 中设置正确的 PATH 几个位置,并在创建新的 external-build 目标时勾选 Pass build settings in environment 复选框。

为了将来参考,这是我使用的完整过程。回想一下,我的问题是我想
- 将 gnu Makefile 项目导入 Xcode 11,
- 该项目是一组源文件和一个生成在命令行上运行的程序的 Makefile,
- 源文件(以及 Makefile)依赖于在 PATH 中找到的库,我需要在 Xcode 中设置这些库(在我的情况下,我通过 MacPorts 安装了这些库)。

  1. File > New > New Project
  2. 在对话框中选择macOS > Command Line Tool、产品名称等和语言。输入项目的位置。
  3. 删除默认目标和两个默认文件夹。
  4. File > New > Target... 创建一个新目标,然后 Cross-platform > External Build System。为新目标选择一个(产品)名称,以及构建工具(我的是/usr/bin/make)。
  5. (在编辑器区域中选择第 4 步中的新目标)在 Info > External Build Tool Configuration 选项卡中,选择您的 makefile 所在的 Directory确保勾选Pass build settings in environment复选框
  6. 在编辑器区域中选择项目。通过转到Build Settings > All 选项卡,单击+ > Add User-Defined Setting,然后在第一列中添加PATH,并在第二列中添加所需的库路径,将正确的PATH 设置为您的外部库(在我的情况下${PATH}:/opt/local/bin:/opt/local/sbin 将路径附加到我使用 MacPorts 安装的库)。
  7. (我不知道这一步是否绝对必要,但无论如何)点击方案菜单,然后点击Edit scheme...Product > Scheme > Edit scheme...。然后在Run > Arguments > Environment Variables 下添加PATH,如第 6 步所示。
  8. 单击方案菜单并选择新目标,使勾选标记位于其旁边(因此这是活动目标??)。
  9. 将源文件添加到项目中,例如将它们从 Finder 拖放到导航区域。确保勾选 Add to target 复选框。
  10. 确保在您的 Makefile 中,您的编译器设置了 -g 标志以启用调试。
  11. Cmd+B 构建。
  12. 一旦构建,通过选择Edit scheme...(按照步骤7)告诉Xcode可执行文件在哪里,然后选择Run > Info > Executable > Other...,导航到项目文件夹,并选择在步骤11中构建的命令行可执行文件。
  13. Cmd+R 运行。

也许有些步骤是不需要的,我不确定。我很乐意了解是否有更好的方法来做到这一点。

【讨论】:

  • 谢谢!这对我帮助很大。
  • ataravati,我在这方面的成功最终非常有限。我可以在 Xcode 中编译和运行代码,但调试功能非常有限。因此,这可能不是您的最佳解决方案。如果您发现如何更好地获得 Xcode 调试器的全部功能,我很想听听!
  • 事实上,在我发表评论后,我遇到了另一个问题。在我的例子中,Makefile 被使用了两次,一次使用ExternalBuildToolExecution 命令,第二次使用PhaseScriptExecution 命令。通过将 PATH 添加到构建设置(步骤 6)解决了第一个问题,但第二个问题仍然失败。未正确拾取 PATH。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 2011-01-12
相关资源
最近更新 更多