【问题标题】:Xcode to develop for the Arduino为 Arduino 开发的 Xcode
【发布时间】:2011-11-08 02:45:45
【问题描述】:

请仔细阅读本文以确保您了解我想要做什么。

  • 我确实希望 Xcode 能够编译,但前提是我可以在 Xcode 中进行调试。
  • 我不想使用 Xcode 编译或上传代码到 Arduino 板。我将在“使用外部编辑器”模式下使用 Arduino IDE。

我做了什么(也可以作为未来可能想做同样事情的人的参考):

  • 在项目设置中(单击左侧窗格中的项目文件)
  • 我已将编译器更改为 GCC 以避免许多错误。
  • 我已将以下路径添加到标题搜索路径和库搜索路径:

    • /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/lib/gcc/avr/4.3.2/include
    • /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr/include
    • /Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino

(如果您在 Applications 文件夹以外的位置安装了 Arduino.app,则需要相应地调整路径。)

在 main.cpp 中,我包含了<WProgram.h>,但这还不够。由于无法将-mmcu=somechipname 作为标志传递给编译器,我收到未定义的标识符错误(对于 SPCR、SPE、MSTR、SPR1、SPR0),这导致没有定义设备并且avr/io.h 无法包括定义这些符号的文件。我通过手动包含<avr/iom328p.h> 来解决它,这是我的芯片的适当头文件。

这就是我得到的。

现在我收到这些错误:

Undefined symbols for architecture i386:
  "_init", referenced from:
      _main in main.o
  "_setup", referenced from:
      _main in main.o
  "_loop", referenced from:
      _main in main.o
  "_pinMode", referenced from:
      SBSetup()    in main.o
  "_digitalWrite", referenced from:
      SBSetup()    in main.o

整个 main.cpp 包括恶意代码是这样的:

#include <WProgram.h>
#include <avr/iom328p.h>    // Getting around warning "device type not defined"
#define NumLEDs 25
#define clockpin 13 // CI
#define enablepin 10 // EI
#define latchpin 9 // LI
#define datapin 11 // DI

int LEDChannels[NumLEDs][3] = {0};
int SB_CommandMode;
int SB_RedCommand;
int SB_GreenCommand;
int SB_BlueCommand;

void SBSetup(void) {
    pinMode(datapin, OUTPUT);
    pinMode(latchpin, OUTPUT);
    pinMode(enablepin, OUTPUT);
    pinMode(clockpin, OUTPUT);
    SPCR = (1<<SPE)|(1<<MSTR)|(0<<SPR1)|(0<<SPR0);
    digitalWrite(latchpin, LOW);
    digitalWrite(enablepin, LOW);
}

int main(void)
{
    init();
    setup();
    for (;;)
        loop();
    return 0;
}

我该怎么办?

【问题讨论】:

  • 实际上,有人让我意识到错误发生在链接时。所以代码确实可以编译,这就是我想要的调试目的。无论如何我都会保持这个开放状态,因为我要在 8 小时后才能自行回答这个问题,而且如果这些错误消失了会更好。
  • 您将无法使用 Xcode “编译”任何内容。但是,当您在 Xcode 上单击 run 时,您将能够使用 Xcode IDE 作为您的高级编辑器并使用独立的 GCC 进行编译/上传,仅此而已。您不能将 LLDB 附加到 Arduino 进行调试。
  • 另外请记住,当您看到这个Undefined symbols for architecture i386: 时,这意味着您正在尝试在 i386 (x86 intel) 机器上编译 AVR(或者可能是 ARM)代码,它只是不起作用。

标签: c++ c xcode arduino undefined-symbol


【解决方案1】:

这两个很好的参考资料让您设置 XCode 不仅用于编译,还用于上传:

  1. http://www.quietless.com/kitchen/setting-up-xcode-to-compile-upload-to-an-arduino-atmega328-duemilanove/
  2. https://github.com/timknapen/Arduino-With-XCode#readme

第一个解释了您需要的其他工具,而第二个提供了 XCode 4.2(和以前的版本)的项目模板。

我都用过,效果很好。

【讨论】:

    【解决方案2】:

    我认为您最好的方法可能是忘记 XCode,而只使用 Arduino IDE。

    不管它值多少钱,听起来你都不是在为正确的平台(i386?)构建。假设您有 GCC 的 AVR 工具链,您可能会在 Arduino IDE 源代码中查看默认开关:

    src\Compiler.java

    祝你好运!

    【讨论】:

    • 不,我想使用 Xcode,因为 Arduino IDE 很烂。严重地。据我所知,没有办法将 avr-gcc 与 Xcode 一起使用......而且我认为我不需要它,因为从 Xcode 编译的代码不会用于 arduino。
    • 另外,我发布这个是因为我显然不想使用 Arduino IDE。请不要告诉我只是使用它。
    • 我不是在告诉你“只使用它”。我是说 Xcode 可以很好地编辑、编译、链接和调试你的 (Mac?) 代码;但您可能无法试图强制 XCode 编辑、编译、链接、下载和调试 Arduino 代码。对于 Arduino 部分,您最好只使用 Arduino IDE。我还说,如果您想“强制输入”XCode,您可能会通过查看 Compiler.java 恕我直言,获得一些关于 GCC 编译器标志等的提示...
    【解决方案3】:

    有很多人制作 XCode 项目模板,用于从 XCode 编译和上传。

    我刚刚添加了适用于包括库、代码完成等的版本。但它们仅在 XCode 3.2 中用作项目模板

    我认为您仍然可以在 XCode4 中打开项目并将它们用作指南来解决您遇到的错误。..

    您可以在这里找到它们:https://github.com/timknapen/Arduino-With-XCode

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 2013-08-24
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多