Как я могу использовать g ++ для получения ассемблерного кода для файла заголовка C ++ (.hpp)?

Я заинтересован в попытке увидеть код сборки для моего заголовочного файла. Поиграться с простым файлом .cpp с помощью фиктивного метода main и скомпилировать его легко: 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;
}

Я также пробую это с другим hpp-файлом с именем struct.hpp:

struct Coord
{
int x;
int y;
};

Одна и та же ошибка для обоих, но я хочу иметь возможность видеть сборку для обоих заголовков, не конвертируя их в файлы .cpp (потому что это нарушает смысл файла заголовка.)

2

Решение

Вы можете заставить g ++ рассматривать файл .hpp как исходный файл C ++.

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

Причина, по которой вы получаете это сообщение «дважды указано имя файла при выводе», заключается в том, что при передаче файла заголовка в 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

Так и есть -o указывается дважды, один раз от вашего -o и один раз из компилятора.

(Конечно, компилятор может избежать добавления -o /tmp/ccxEg3J7.s, но дополнительная сложность для этого крайнего случая не стоит того.)

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]