7

私のツールチェーンは arm-gcc の最近のバージョンです。

条件付きでインクルード/アセンブルする必要があるアセンブリ ファイルにコードがあります。

.ifdef MACRO_FROM_CMDLINE
 Assembly instr1
 Assembly instr2
.endif

カプセル化されたコードは最近追加されました。

私は両方を試しました:

gcc -x assembler-with-cpp --defsym MACRO_FROM_CMDLINE=1 <along with other necessary options> 

gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 <along with other necessary options>   

その-D結果、「.ifdef の無効な識別子」および「.if なしの .endif」エラーが発生します。

その--defsym結果、「MACRO_FROM_CMDLINE=1 : そのようなファイルまたはディレクトリはありません」、「認識されないオプション --defsym」エラーが発生します。

4

2 に答える 2

13

バイナリはgcc、他の多くのプログラムを順番に呼び出して、作業のさまざまな段階(コンパイル、アセンブル、リンク)を実際に実行することにより、コンパイルプロセスを推進します。

あなたが言う時:

gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 ...

Cプリプロセッサを介してソースを実行し、次にアセンブラを介して結果を実行するように要求しています。

Cプリプロセッサのステップは次のようになります。

.ifdef MACRO_FROM_CMDLINE

の中へ:

.ifdef 1

それをアセンブラに渡す前に、アセンブラはそれを理解できません。これが、「無効な識別子」エラーが発生する理由です。また、Cプリプロセッサを使用すると問題が解決する理由についても説明し#ifdefます。


--defsymgccドライバープログラムではなく、アセンブラーのオプションであるため、機能しません。(gccドライバーは、いくつかのオプションを理解して、呼び出すプログラムのいくつかに渡しますが、すべてではありません。

ただし、を使用して任意のオプションをアセンブラに渡すことができます。

-Wa,option[,option...]

構文。gccこれらのオプションを(スペースで区切られたオプションのリストとして)アセンブラーに渡すようにドライバーに指示します。

例えば:

gcc -x assembler-with-cpp -Wa,--defsym,MACRO_FROM_CMDLINE=1 ...

追加します

--defsym MACRO_FROM_CMDLINE=1

asそれを呼び出すときに渡されるオプションのリストにgcc、それが元の例を機能させる方法.ifdefです。


オプションを追加することで、によって呼び出される個々のプログラムgccと、実際にプログラムに渡される-vオプションを確認できます。

この場合、一時ファイルへの入力を前処理するためにフラグ(前処理のみ)で呼び出され、一時ファイルで呼び出されてアセンブルされるcc1(実際のGCC Cコンパイラバイナリ)と呼ばれるものが表示されます。-Eas

于 2012-10-07T18:39:56.003 に答える
1

奇妙ですが、アセンブリ ファイルで C 構文を使用する必要があることがわかりました。

#ifdef MACRO
  Assembly Instruction
  Assembly Instruction
#endif

また、マクロは -D オプションを使用して渡す必要がありました。

于 2012-10-07T17:17:30.807 に答える