вторник, 29 октября 2013 г.

Конфигурация cmake для проекта на C++ с использованием boost

Задача стояла следующая. Есть кроссплатформенный проект на C++ (назовем его, к примеру, boost_test), который использует библиотеки boost (для примера, boost-filesystem). Используемый компилятор - gcc. Необходимо сформировать файл CMakeLists.txt, обеспечив статическое связывание проекта с нужными библиотеками boost и gcc в среде windows и динамическое в GNU/Linux. А заодно и освоить cmake, к которому давно приглядывался.

В результате, CMakeLists.txt получился следующим.
cmake_minimum_required(VERSION 2.8)

project(boost_test)
set(APP_NAME boost_test)
set(CMAKE_BUILD_TYPE RELEASE)

aux_source_directory(src SRC_LIST)

set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -W -pedantic")

if(MINGW)
    set(Boost_USE_STATIC_LIBS ON)
    set(Boost_USE_SHARED_LIBS OFF)
else()
    set(Boost_USE_STATIC_LIBS OFF)
    set(Boost_USE_SHARED_LIBS ON)
endif()
find_package(Boost COMPONENTS system filesystem REQUIRED)
if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIR})
endif()
if(MINGW)
    set(BUILD_STATIC_LIBS ON)
    set(BUILD_SHARED_LIBS OFF)
    set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
else()
    set(BUILD_STATIC_LIBS OFF)
    set(BUILD_SHARED_LIBS ON)
endif()

add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(
    ${PROJECT_NAME}
    ${Boost_SYSTEM_LIBRARY}
    ${Boost_FILESYSTEM_LIBRARY}
    ${Boost_LIBRARIES}
)

Вдогонку, привожу несколько ссылок с неплохим, на мой взгляд, введением в cmake:
Хм.. И почему вот эти последние заметки не попались мне до того, как я закончил свой конфиг? Было бы куда проще, черт возьми )

boost. Компиляция с помощью gcc (mingw) в Windows

Оставим вводную в стороне и сразу за дело. На компьютере с Windows, где мне предстояло установить библиотеки boost, уже был установлен Qt, поэтому при сборке использовался mingw из комплекта Qt. Однако, ничто не мешает взять последнюю версию mingw отсюда. Итак, распаковываем скачанный архив boost и готовимся к сборке. Подготовка подразумевает правку файла bootstrap.bat и создание еще одного батника, назовем его build.bat. У меня содержимое этих файлов вышло следующее.

bootstrap.bat
@ECHO OFF

REM Copyright (C) 2009 Vladimir Prus
REM
REM Distributed under the Boost Software License, Version 1.0.
REM (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)

SET MINGWDIR=c:\Qt\Qt5.1.1\Tools\mingw48_32\bin\
SET BOOSTDIR=c:\boost\1.54.0\
SET PATH=%MINGWDIR%;PATH

ECHO Building Boost.Build engine
if exist ".\tools\build\v2\engine\bin.ntx86\b2.exe" del tools\build\v2\engine\bin.ntx86\b2.exe
if exist ".\tools\build\v2\engine\bin.ntx86\bjam.exe" del tools\build\v2\engine\bin.ntx86\bjam.exe
if exist ".\tools\build\v2\engine\bin.ntx86_64\b2.exe" del tools\build\v2\engine\bin.ntx86_64\b2.exe
if exist ".\tools\build\v2\engine\bin.ntx86_64\bjam.exe" del tools\build\v2\engine\bin.ntx86_64\bjam.exe
pushd tools\build\v2\engine

call .\build.bat gcc > ..\..\..\..\bootstrap.log
@ECHO OFF

popd

if exist ".\tools\build\v2\engine\bin.ntx86\bjam.exe" (
   copy .\tools\build\v2\engine\bin.ntx86\b2.exe . > nul
   copy .\tools\build\v2\engine\bin.ntx86\bjam.exe . > nul
   goto :bjam_built)

if exist ".\tools\build\v2\engine\bin.ntx86_64\bjam.exe" (
   copy .\tools\build\v2\engine\bin.ntx86_64\b2.exe . > nul
   copy .\tools\build\v2\engine\bin.ntx86_64\bjam.exe . > nul
   goto :bjam_built)

goto :bjam_failure

:bjam_built

REM Ideally, we should obtain the toolset that build.bat has
REM guessed. However, it uses setlocal at the start and does
REM export BOOST_JAM_TOOLSET, and I don't know how to do that
REM properly. Default to msvc for now.
set toolset=msvc

ECHO import option ; > project-config.jam
ECHO. >> project-config.jam
ECHO using %toolset% ; >> project-config.jam
ECHO. >> project-config.jam
ECHO option.set keep-going : false ; >> project-config.jam
ECHO. >> project-config.jam

ECHO.
ECHO Bootstrapping is done. To build, run:
ECHO.
ECHO     .\b2
ECHO.    
ECHO To adjust configuration, edit 'project-config.jam'.
ECHO Further information:
ECHO.
ECHO     - Command line help:
ECHO     .\b2 --help
ECHO.     
ECHO     - Getting started guide: 
ECHO     http://boost.org/more/getting_started/windows.html
ECHO.     
ECHO     - Boost.Build documentation:
ECHO     http://www.boost.org/boost-build2/doc/html/index.html

goto :end

:bjam_failure

ECHO.
ECHO Failed to build Boost.Build engine.
ECHO Please consult bootstrap.log for furter diagnostics.
ECHO.
ECHO You can try to obtain a prebuilt binary from
ECHO.
ECHO    http://sf.net/project/showfiles.php?group_id=7586^&package_id=72941
ECHO.
ECHO Also, you can file an issue at http://svn.boost.org 
ECHO Please attach bootstrap.log in that case.

goto :end

:end
В этом файле, по сравнению с оригинальным, добавлены строки
SET MINGWDIR=c:\Qt\Qt5.1.1\Tools\mingw48_32\bin\
SET BOOSTDIR=c:\boost\1.54.0\
SET PATH=%MINGWDIR%;PATH
И изменена строка
call .\build.bat gcc > ..\..\..\..\bootstrap.log

build.bat
SET MINGWDIR=c:\Qt\Qt5.1.1\Tools\mingw48_32\bin\
SET BOOSTDIR=c:\boost\1.54.0\

SET PATH=%BOOSTDIR%;%MINGWDIR%;PATH
CD %BOOSTDIR%
b2.exe --build-dir=%BOOSTDIR% toolset=gcc --build-type=complete stage

После того, как необходимые файлы отредактированы/созданы, приступаем к сборке. Для этого необходимо запустить сначала bootstrap.bat, который произведет компиляцию утилит автоматизации сборки библиотеки boost, а затем - созданный нами build.bat, который запустит сборку самой boost.
В общем-то и все. Скомпилированные библиотеки можно будет найти в каталоге stage.

Первоисточник: http://studff.ru/blog/programming/85.html.

UPD 18.12.2014

Заглянул в статистику своего блога и был удивлен популярностью данной статьи. На сегодняшний день, при актуальной версии boost 1.57, подобных манипуляций делать уже не нужно. Имея установленный MinGW, boost можно спокойно собрать буквально двумя командами (из каталога с исходниками).
bootstrap mingw
b2 toolset=gcc --build-type=complete

UPD 24.04.2017

Рекомендуется к прочтению заметка boost. Компиляция с помощью gcc (mingw) в Windows. Более простой метод

воскресенье, 13 октября 2013 г.

Запись скринкастов с помощью vlc

vlc - замечательная программа. Лично я использую ее и для просмотра фильмов, и для прослушивания музыки. Стоит отметить, что vlc не только плеер. Это настоящий комбайн. Так, с помощью vlc можно, к примеру, записывать скринкасты или конвертировать видео/аудио из одних форматов в другие. При этом настройки профилей доступны для редактирования.
В этой заметке я хочу показать, как выполняется запись скринкастов.

Запускаем vlc и выбираем пункт меню "Медиа -> Конвертировать/Сохранить".

В открывшемся диалоговом окне переходим на вкладку "Устройство захвата" и в качестве режима захвата выбираем "Экран". Выставляем желаемую частоту кадров и нажимаем на кнопку "Конвертировать/Сохранить".

В очередном диалоговом окне необходимо выбрать профиль, уточнить его настройки (контейнер, видеокодек, аудиокодек) и выбрать файл в который будет сохранен результат. После нажатия на кнопку "Начать" начнется запись.

Останавливается запись путем нажатия на кнопку "Останов" в главном окне vlc.

Вот, собственно, и все.