2017-05-15 6 views
1

私は次の問題に苦しんでいます。C++ Windows makefile 32k param limit/* .o〜* .aファイルリンク

私は組み込みMCU用のオペレーティングシステムであるmbed_osをビルドしています。コンパイル時にオプションの* .oファイルをビルドするか、* .aライブラリにリンクしてそれを自分のコードと共に使用します。

私がmbed_osをビルドし、すべての* .oファイルをメイクファイルに別々にリストすると、うまく動作し、最終的なバイナリがうまく動作します。しかし、コンパイル時に* .aライブラリを作成し、それを私のmakefileにリストすると、最後のバイナリはMCUで実行されず、MCUはフリーズしてしまいます。しかし、コンパイルはsucessffullです。それが私の最初の問題です。

私は一時的に* .aファイルの束を単一* .aファイルの代わりにmakefileで使用することで* .a問題を回避することができます。しかし、もう一つのことがあります。

私はmbed_osの多くの機能を使用すると、もちろん非常に* .oファイルが必要で、ある時点で "arm-none-eabi-gcc:error:CreateProcess:そのようなファイルがありませんまたはディレクトリ "と入力します。私の知る限りでは、*。oファイルのリストは32k文字より少し大きいです。

これを修正する方法はありますか?私のメイクファイルでの* .oファイルの

一覧は

SYS_OBJECTS += ./_libs_/mbed-os_ ... AnalogIn.o 
SYS_OBJECTS += ./_libs_/mbed-os_ ... BusIn.o 
SYS_OBJECTS += ./_libs_/mbed-os_ ... BusInOut.o 
SYS_OBJECTS += ./_libs_/mbed-os_ ... BusOut.o 
... 

ようSYS_OBJECT変数に追加されたと私はGNU ARM Eclipseが

c:\Program Files (x86)\GNU ARM Eclipse\Build Tools\2.8-201611221915\bin\make.exe 

に保存されているツールを構築し、腕-なし - 使用していますeabi-gcc-6.3.1。私のOSはWindows 10 PRO 10.0.14393です。

重要なことは、Windows 10 bashでコンパイルすると、すべて正常に動作するため、問題はWin cmdでのみ表示されることです。

+1

'いくつかの私がいることを発見したグーグルの後Windows用の32kの制限がありますcmd agrument'通常、コンパイラはコマンドラインをファイルに書き込んでからファイル名を渡す方法を提供します。そこから始めよう。 – Qix

+0

mbed-cliを使用していますか? –

+0

@Qix - paramsをファイルに渡し、それをコンソールの引数として与える方法の詳細を教えてください。 Arm-gcc-noneabiには--specsという名前のparamがありますか?私はnano.specsのようなものが使用されていることに気付きました。おそらく、それをnano.specsに追加する必要があります。 –

答えて

0

解決方法32kリミットをバイパスする方法は簡単でした。回答、特に@Qixに感謝します。代わりに、メイクファイルでこの行の

$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS) 
    $(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o [email protected] $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS) 

は、引数としてリンカーに渡され.args.txtファイルとそのファイルに参照するために保存された引数です

$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS) 
    @echo $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o [email protected] $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS) > .args.txt 
    $(LD) @./.args.txt