Я заинтересован в попытке увидеть код сборки для моего заголовочного файла. Поиграться с простым файлом .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 (потому что это нарушает смысл файла заголовка.)
Вы можете заставить 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
, но дополнительная сложность для этого крайнего случая не стоит того.)
Других решений пока нет …