hunamizawa’s blog

無い物は作りたい人のメモ帳

Atmel Studioで「recipe for target 'main.o' failed」で詰む→全角文字を含むWindowsユーザー名が原因でした

要約

  1. Atmel Studio 7.0 でrecipe for target 'main.o' failedと出てビルドできない
  2. Windows のユーザー名に全角文字(全角スペース?)が含まれていることが原因
  3. Windows の一時ディレクトリを、全角文字を含まないパスへ移動することで解決

経過

Atmel Studio 7.0 をインストールして、さっそく単純なLチカプログラムを作成(ATTiny13A の PB3 に繋いだLEDをただ点滅させる)。

#include <avr/io.h>

int main(void)
{
    uint16_t i;
    DDRB = (1 << DDB3);
    PORTB |= (1 << PORTB3);
    while (1)
    {
        for (i = 0; i < 26500; i++) ;
        PORTB = ~PORTB & (1 << PORTB3);
    }
}

ところが、こんな単純なコードがrecipe for target 'main.o' failedと言われてビルドできない。

ここで Output をよく見ると、

'C:\Users\[ユーザー名の一部]' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
make: *** [main.o] Error 1

どうやら内部で make を走らせているようだが、全角スペースの扱いでコケているらしい(もしかしたらスペース以外の全角文字もダメかもしれない)。

原因究明のため、コマンドプロンプトから直接make -dと叩いてみると、次のようなログを得た。

(略)
Must remake target `main.o'.
Creating temporary batch file C:\Users\[ユーザー名の一部] ~1\AppData\Local\Temp\make5676-1.bat
CreateProcess(C:\Users\[ユーザー名の一部] ~1\AppData\Local\Temp\make5676-1.bat,C:\Users\[ユーザー名の一部] ~1\AppData\Local\Temp\make5676-1.bat,...)
Putting child 0x029d3108 (main.o) PID 43895224 on the chain.
Live child 0x029d3108 (main.o) PID 43895224
Main thread handle = 0x000000f0
'C:\Users\[ユーザー名の一部]' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
Reaping losing child 0x029d3108 PID 43895224
Cleaning up temp batch file C:\Users\[ユーザー名の一部] ~1\AppData\Local\Temp\make5676-1.bat
make: *** [main.o] Error 1
Removing child 0x029d3108 PID 43895224 from chain.

ユーザー環境変数で設定された %TMP% にバッチファイルを生成して実行しているようだが、パスを正しくクオートしていないのだろうか。

要するに、一時ディレクトリのパスに全角文字が含まれているのでビルドできない

なら解決するのは簡単で、一時ディレクトリの場所を、全角文字を含まないパスに変えてしまえばいい。

www.atmarkit.co.jp

私は C:\Temp に移動した。PCを再起動してもう一度ビルドしてみたところ、無事にBuild succeeded.

追記: クリーンインストールを機に、ユーザー名を半角英数にした。最初からこうしておけばハマることはなかっただろう……