Как мне генерировать и использовать предварительно скомпилированные заголовки с Clang ++? - PullRequest
1 голос
/ 28 апреля 2019

В официальных документах указано, как предварительно скомпилированные заголовки должны использоваться через интерфейс -cc1, например, для их генерации:

$ clang -cc1 test.h -emit-pch -o test.h.pch

И для их использования:

$ clang -cc1 -include-pch test.h.pch test.c -o test.s

Проблема в том, что интерфейс -cc1 слишком низкоуровневый для использования разработчиками из CLI.Фактически, обычный высокоуровневый интерфейс в конечном итоге вызывает низкоуровневый интерфейс -cc1, предоставляя ему очень большой набор аргументов, необходимых для его правильной работы, например, пути включения, подходящие для системы времени компиляции.Без этих аргументов интерфейс -cc1 не будет молиться о работе:

$ clang++ -cc1 /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h -emit-pch -o std.pch
/usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:33:10: fatal error: 'cassert' file not found
#include <cassert>
         ^~~~~~~~~
         1 error generated.

Есть ли способ использовать предварительно скомпилированные заголовки из интерфейса высокого уровня, чтобы разработчик мог удобно использовать эту функцию во времяих ежедневная работа?

1 Ответ

0 голосов
/ 28 апреля 2019

Я думаю, что корень вашей проблемы в том, что ваше имя файла test.h, и clang считает, что вы компилируете код C, а не код C ++.Следовательно, когда вы включаете <cassert>, clang не знает, что он должен искать путь включения C ++.Попробуйте назвать свой файл test.hpp.Вам нужно только назвать файл, который вы хотите, в качестве заголовка precomp с .hpp.Вы можете хранить все ваши заголовочные файлы с расширениями * 1005. *. 1006 *

В любом случае, я могу запутаться с gcc / g ++, но Clang следует тому же самому поведению всякий раз, когда я компилирую свой код на Mac.Вот как я использую предварительно скомпилированные заголовки.Читайте дальше ...

Если у вас есть заголовочный файл C ++, который вы хотите прекомпилировать, просто скомпилируйте его как любой другой файл .cpp.Обратите внимание, что я использую .hpp в качестве расширения файла, поэтому компилятор выбирает его как заголовочный файл C ++.

clang -c precomp.hpp

Это приведет к precomp.hpp.gch

Теперь для использованияпрекомпилируйте любым другим обычным файлом C ++, просто включите обычный файл .hpp:

// main.cpp
#include "precomp.hpp"

void func1() {...}
void main() {...}

Компилятор автоматически использует соответствующий файл .gch, если он присутствует вместо исходного файла .hpp.

...