Постаревшие школьники, которые программировали черепашку на уроках информатики, оценят по достоинству. :)
По моим наблюдениям, водители Санкт-Петербурга делятся на опытных, неопытных и неадекватных. Сейчас я поделюсь своим скромным опытом в распознавании неадекватного водителя. Будем учиться определять такое существо по его машине и поведению на дороге.
- ЕЗДИТ НА ТЮНИНГОВАННОМ АВТОМОБИЛЕ. Существует особых вид тюнинга автомобиля — так называемый ара-тюнинг. Как бы и не тюнинг вовсе, а какая-то хрень. Как это выглядит каждый мог лицезреть по телевизору. Адекватность водителя машины с выхлопной трубой диаметром в 10 сантиметров и скамейкой на крыше в объяснении не нуждается
- СЛУШАЕТ ГРОМКУЮ МУЗЫКУ. Такую, что стекла дребезжат. Особенно с открытыми окнами
- РАССЕКАЕТ БЕЗ НОМЕРНЫХ ЗНАКОВ (даже транзитных). Тут два варианта: или человеку все пофигу и он спокойно свалит с места ДТП, или он только что купил машину
- ГОВОРИТ ПО МОБИЛКЕ. Особо клинический случай представляет собой расслабленного
идиотаводителя с трубкой, зажатой между ухом и плечом, при это весь мир предстает перед ним наклоненным на 30-45 градусов - ПЕРЕСТРАИВАЕТСЯ ИЗ РЯДА В РЯД КАЖДЫЕ 100 МЕТРОВ. Это означает, что водитель или торопится
на кладбище, или дурак. А может дурак куда-то торопится - НЕ ВКЛЮЧАЕТ ПОВОРОТНИКИ. Создается впечатление, что некоторым дорогим иномаркам поворотники ампутируют еще в автосалоне. В голове рисуется картина, как будущий владелец автомобиля умоляет менеджера салона не отрезать нужные на дороге поворотники, но тот остается глухим к слезам водителя
- НЕОПЫТНЫЙ ВОДИТЕЛЬ БЕЗ СПЕЦИАЛЬНОГО ЗНАКА. Этот персонаж особенно интересен и распознать его довольно сложно. Помните, как только вы вешаете знак «Неопытный водитель», ваши дебильные выходки за рулем, которые вызывают злобу и ненависть окружающих, автоматически превращаются в робкие попытки юного водителя справится с автомобилем, которые в свою очередь могут вызвать только умиление и улыбку. :) Удивительно, не правда ли?
P.S. Вышенаписанное является черновиком. Я буду дополнять эту заметку по мере поступления новых данных. :)
Как неожиданно выяснилось, предыдущие варианты (раз, два, три) оказались неправильными. Публикую окончательный правильный вариант использование precompiled headers при компиляции nmake или в Visual Studio 2008:
CMakeLists.txt
macro( use_precompiled_header SRC_LIST_VAR HDR_FILE SRC_FILE ) get_filename_component( PCH_HEADER ${HDR_FILE} NAME ) get_filename_component( PCH_BINARY ${HDR_FILE} NAME_WE ) set( PCH_BINARY "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${PCH_BINARY}.pch" ) if (MSVC) set( SRC_LIST ${${SRC_LIST_VAR}} ) set_source_files_properties( ${SRC_LIST} PROPERTIES COMPILE_FLAGS "/Yu${PCH_HEADER} /Fp${PCH_BINARY}" OBJECT_DEPENDS "${PCH_BINARY}" ) set_source_files_properties( ${SRC_FILE} PROPERTIES COMPILE_FLAGS "/Yc${PCH_HEADER} /Fp${PCH_BINARY}" OBJECT_OUTPUTS "${PCH_BINARY}" OBJECT_DEPENDS "" ) endif(MSVC) endmacro( use_precompiled_header ) |
Особенное внимание обратите на использование:
file( GLOB_RECURSE CORE_SRC *.cpp ) use_precompiled_header( CORE_SRC precompiled.h precompiled.cpp ) |
CORE_SRC — это НАЗВАНИЕ переменной, а не сама переменная.
P.S. С версии CMake 3.16.0 доступна команда target_precompiled_headers(), которая позволяет без лишних усилий работать с precompiled headers.
В нашей системе сборки все сторонние библиотеки компилируются вместе с проектом, поэтому стандартное FIND_PACKAGE нам не подходит. Значит, CMakeLists.txt из сборки OgreBullet тоже идет лесом. Поэтому приходится извращаться на свой лад.
CMakeLists.txt
# Название проекта project( OgreBullet ) # Разделяем исходники для двух precompiled headers file( GLOB_RECURSE OGRE_BULLET_COLLISIONS Collisions/*.cpp ) file( GLOB_RECURSE OGRE_BULLET_DYNAMICS Dynamics/*.cpp ) # Папки для поиска #include include_directories( ${GLOBAL_INCLUDE_DIR}/Ogre ${GLOBAL_INCLUDE_DIR}/OgreBullet/Collisions ${GLOBAL_INCLUDE_DIR}/OgreBullet/Dynamics ${GLOBAL_LIB_DIR}/Bullet ${GLOBAL_LIB_DIR}/Bullet/BulletConvexDecomposition ${GLOBAL_LIB_DIR}/Bullet ) # Определяем макрос для использования precompiled headers macro(use_precompiled_header SRC_LIST HDR_FILE SRC_FILE) # Выделяем имя заголовка без пути get_filename_component(PCH_HEADER ${HDR_FILE} NAME) # Выделям имя заголовка без расширения и пути get_filename_component(PCH_BINARY ${HDR_FILE} NAME_WE) # Полный путь к созданному pch set(PCH_BINARY "${CMAKE_CURRENT_BINARY_DIR}/${PCH_BINARY}.pch") if (MSVC) # Для precompiled.cpp создаем pch, указывая файл (OBJECT_OUTPUTS), который создается в результате комманды set_source_files_properties( ${SRC_FILE} PROPERTIES COMPILE_FLAGS "/Yc${PCH_HEADER} /Fp${PCH_BINARY}" OBJECT_OUTPUTS "${PCH_BINARY}" ) # Для каждого исходника в списке, задаем зависимость от precompiled.pch и указываем использовать его параметром "/Yu" foreach( SOURCE ${SRC_LIST} ) set_source_files_properties( ${SOURCE} PROPERTIES COMPILE_FLAGS "/Yu${PCH_HEADER}" OBJECT_DEPENDS "${PCH_BINARY}" ) endforeach( SOURCE ${SRC_LIST} ) endif(MSVC) endmacro(use_precompiled_header) # Создаем precompiled header для Collisions use_precompiled_header( OGRE_BULLET_COLLISIONS "${GLOBAL_INCLUDE_DIR}/OgreBullet/Collisions/OgreBulletCollisions.h" Collisions/OgreBulletCollisionsPrecompiled.cpp ) # Создаем precompiled header для Dynamics use_precompiled_header( OGRE_BULLET_DYNAMICS "${GLOBAL_INCLUDE_DIR}/OgreBullet/Dynamics/OgreBulletDynamics.h" Dynamics/OgreBulletDynamicsPrecompiled.cpp ) # Объединим два списка файлов для удобства set( OGRE_BULLET_SRC "${OGRE_BULLET_COLLISIONS}" "${OGRE_BULLET_DYNAMICS}" ) # Добавляем define для использования precompiled headers библиотекой OgreBullet add_definitions( -D_PRECOMP ) # Profit! add_library( ogre_bullet STATIC ${OGRE_BULLET_SRC} ) |
UPDATE: Окончательный вариант precompiled headers смотрим здесь.