Хтось мав успіх, отримуючи попередньо скомпільовані заголовки, що працюють з GCC? Мені не пощастило у спробах, і я не бачив багато хороших прикладів того, як це налаштувати. Я пробував cygwin gcc 3.4.4 та використовував 4.0 на Ubuntu.
Хтось мав успіх, отримуючи попередньо скомпільовані заголовки, що працюють з GCC? Мені не пощастило у спробах, і я не бачив багато хороших прикладів того, як це налаштувати. Я пробував cygwin gcc 3.4.4 та використовував 4.0 на Ubuntu.
Відповіді:
Я точно мав успіх. Спочатку я використав такий код:
#include <boost/xpressive/xpressive.hpp>
#include <iostream>
using namespace std;
using namespace boost::xpressive;
//A simple regex test
int main()
{
std::string hello( "hello world!" );
sregex rex = sregex::compile( "(\\w+) (\\w+)!" );
smatch what;
if( regex_match( hello, what, rex ) )
{
std::cout << what[0] << '\n'; // whole match
std::cout << what[1] << '\n'; // first capture
std::cout << what[2] << '\n'; // second capture
}
return 0;
}
Це був просто привіт світ від Boost Xpressive (посилання див. Нижче). Спочатку я скомпілював з -H
опцією у gcc. Він показав величезний список заголовків, які він використовував. Потім я подивився на прапори компіляції, які створювала моя IDE (код :: блоки), і побачив щось подібне:
g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o
Тому я написав команду для компіляції файлу Xpressive.hpp з точно такими ж прапорами:
sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp
Я знову скомпілював вихідний код за допомогою -H
і отримав такий результат:
g ++ -Wall -fexceptions -H -g -c main.cpp -o obj / Debug / main.o ! /usr/local/include/boost/xpressive/xpressive.hpp.gch main.cpp . /usr/include/c++/4.4/iostream ../usr/include/c++/4.4/x86_64-linux-gnu/bits/c++config.h ../usr/include/c++/4.4/ostream ../usr/include/c++/4.4/istream main.cpp
The! означає, що компілятор зміг використовувати попередньо скомпільований заголовок. Значок х означає, що він не зміг ним скористатися. Використання відповідних прапорів компілятора є вирішальним. Я зняв -H і провів кілька тестів на швидкість. Попередньо скомпільований заголовок покращився з 14 до 11 секунд. Непогано, але не чудово.
Примітка: Ось посилання на приклад: http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples Я не міг змусити його працювати в пост.
До речі: я використовую наступний g ++
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
-Winvalid-pch
щоб переконатись, що попередньо скомпільований заголовок використовується належним чином? Ми помічаємо значне покращення використання pch для наших налагоджувальних збірок, тому мені цікаво, чи є проблема з вашим налаштуванням.
По-перше, дивіться документацію тут .
Ви компілюєте заголовки так само, як і будь-який інший файл, але виводите результат у файл із суфіксом .gch
.
Так, наприклад, якщо ви попередньо скомпілюєте stdafx.h, у вас буде заздалегідь скомпільований заголовок, який буде автоматично шукатися у stdafx.h.gch
будь-який час, коли ви включитеstdafx.h
Приклад:
stdafx.h:
#include <string>
#include <stdio.h>
a.cpp:
#include "stdafx.h"
int main(int argc, char**argv)
{
std::string s = "Hi";
return 0;
}
Потім скомпілюйте як:
> g++ -c stdafx.h -o stdafx.h.gch
> g++ a.cpp
> ./a.out
Ваша компіляція буде працювати, навіть якщо ви видалите stdafx.h після кроку 1.
Специфікатором -x
для попередньо скомпільованих заголовків на C ++ є -x c++-header
ні -x c++
. Нижче наведено приклад використання PCH.
pch.h
:
// Put your common include files here: Boost, STL as well as your project's headers.
main.cpp
:
#include "pch.h"
// Use the PCH here.
Створіть PCH таким чином:
$ g++ -x c++-header -o pch.h.gch -c pch.h
Щоб використовувати, він pch.h.gch
повинен знаходитися в тому самому каталозі, що і pch.h
, тому переконайтеся, що ви виконали наведену вище команду з каталогу, де pch.h
є.
-c pch.h
, чи не так -c pch.cpp
?
У минулому мені вдалося отримати попередньо скомпільовані заголовки, які працювали під gcc, і я пам'ятаю, що тоді теж були проблеми. Слід пам’ятати, що gcc буде ігнорувати файл (header.h.gch або подібний), якщо певні умови не виконуються, перелік яких можна знайти на сторінці попередньо скомпільованого заголовка gcc .
Як правило, найбезпечніше, щоб система збірки скомпілювала файл .gch як перший крок, з тими ж параметрами командного рядка та виконуваним файлом, що й решта джерела. Це гарантує оновлення файлу та відсутність тонких відмінностей.
Можливо, також непогано спочатку змусити його працювати з надуманим прикладом, просто щоб усунути можливість того, що ваші проблеми стосуються вихідного коду у вашому проекті.
Зателефонуйте gcc так само, як і для вихідного файлу, але з файлом заголовка.
напр
g++ $(CPPFLAGS) test.h
це генерує файл, який називається test.h.gch
Кожного разу, коли gcc шукає test.h, він спочатку шукає test.h.gch, і якщо знаходить, то використовує його автоматично.
Більше інформації можна знайти в Попередньо скомпільованих заголовках GCC
Обов’язково -include your_header.h
Ось як я попередньо скомпілював і використовував bits/stdc++.h
колекцію.
Код
#include <bits/stdc++.h>
Потім я знайшов lib, скомпілювавши мій файл за допомогою -H і переглянувши результати
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
де я бачив
. /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h
Тож я створив новий каталог bits
усередині поточного і скопіював stdc++.h
звідти.
Тоді я побіг
g++ bits/stdc++.h -O3 -std=c++14 -pthread
який породжував bits/stdc++.gch
Зазвичай я компілював свій код через
g++ sol.cpp -O3 -pthread -lm -std=c++14 -o executable
, але мені довелося змінити це на
g++ sol.cpp -include bits/stdc++.h -O3 -pthread -lm -std=c++14 -o executable
оскільки він вирішив лише подати .gch
файл, а не .h
з. -include bits/stdc++.h
Це було для мене ключовим. Інша річ, про яку слід пам’ятати, - це те, що вам потрібно скомпілювати *.h
файл заголовка з майже тими ж параметрами, що і ви *.cpp
. Коли я не включав -O3
або -pthread
він ігнорував *.gch
попередньо скомпільований заголовок.
Щоб перевірити, чи все правильно, можна виміряти різницю в часі шляхом порівняння результату
time g++ sol.cpp ...
або бігати
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
ще раз і знайдіть шляхи заголовків, і якщо тепер ви потрапите !
до шляху до бібліотеки, наприклад
! ./bits/stdc++.h.gch
....