2

ヘッダー ファイルのアセンブリ コードを確認したいと考えています。ダミーの main メソッドを含む単純な .cpp ファイルをいじってコンパイルするのは簡単です。g++ -S -o prog.exe main.cpp

ただし、ここではヘッダー ファイルについて説明します。ダミーのメソッドだけを含むダミーのヘッダー ファイルfunc.hppがあり、それをコンパイルして .S ファイルでそのアセンブリを確認できるようにしたいと考えています。(これの主な理由は、より複雑な関数がある場合、アセンブリで手動で最適化を行い、g++ -o prog.exe func.S main.cpp.

ただし、これを説明する情報源を見つけることができません。試してみるg++ -S -o func.S func.hpp と、エラー メッセージが表示されますoutput filename specified twice。誰でもこれで私を助けることができますか?

参考までに、func.hpp を次に示します。

int number()
{
    return 0;
}

また、struct.hpp という名前の別の hpp ファイルでも試しています。

struct Coord
{
    int x;
    int y;
};

両方で同じエラーが発生しますが、.cpp ファイルに変換せずに両方のヘッダーのアセンブリを表示できるようにしたいと考えています (ヘッダー ファイルの意味が壊れるためです)。

4

1 に答える 1

6

g++ に強制的に .hpp ファイルを C++ ソース ファイルとして処理させることができます。

g++ -x c++ -S -o func.S func.hpp

「出力ファイル名が2回指定されました」というメッセージが表示される理由は、ヘッダーファイルをgccに渡すときに、それをプリコンパイル済みヘッダーにコンパイルすると想定されるためです。名前のとおり、これはヘッダーを「コンパイル」するため、途中で *.s ファイルが生成されます。元のコマンドでフラグを渡す-vと、cc1plus が次のように呼び出されることがわかります。

 /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/cc1plus
     -quiet
     -v 
     -D_GNU_SOURCE 
     func.hpp
     -quiet 
     -dumpbase func.hpp 
     -mtune=generic 
     -march=x86-64 
     -auxbase-strip func.S
     -version 
     -o func.S                # <---
     -o /tmp/ccxEg3J7.s       # <---
     --output-pch= func.S

したがって、実際には、あなたから1回、コンパイラから-o1回、2回指定されています。-o

(もちろん、コンパイラは の追加を避けることができ-o /tmp/ccxEg3J7.sますが、このエッジ ケースの追加された複雑さはそれほど価値がありません。)

于 2012-09-20T13:32:49.777 に答える