@Mars36

Как установить зависимость boost::program_options вместе со своим проектом с помощью ExternalProject_Add в cmake?

Нужно добавить данную зависимость в проект. При сборке выдает
ошибку

Серьезность	Код	Описание	Проект	Файл	Строка	Состояние подавления
Ошибка	MSB8066	пользовательская сборка для "F:\code\C++\tasks\build\CMakeFiles\a02e4265147eb1a3546f70796cde7b11\external_boost-build.rule;F:\code\C++\tasks\build\CMakeFiles\a02e4265147eb1a3546f70796cde7b11\external_boost-install.rule;F:\code\C++\tasks\build\CMakeFiles\0e4e7d5d50178db39cc1c505593c8a26\external_boost-complete.rule;F:\code\C++\tasks\build\CMakeFiles\2daa0d109a3f41d5cd6f5bdbb5817a2f\external_boost.rule" завершила работу с кодом 9009.	external_boost	F:\microsoft\visual_studio\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets	240


ExternalProject.cmake

include( ExternalProject )

set( boost_URL "http://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.zip" )
set( boost_SHA1 "4364989afbe6b11f2d5e59df902c3ca4d7851824" )
set( boost_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/third_party/boost )
set( boost_INCLUDE_DIR ${boost_INSTALL}/include )
set( boost_LIB_DIR ${boost_INSTALL}/lib )

ExternalProject_Add( external_boost
        PREFIX boost
        URL ${boost_URL}
        URL_HASH SHA1=${boost_SHA1}
        BUILD_IN_SOURCE 1
        CONFIGURE_COMMAND bootstrap.bat
            --with-libraries=filesystem
            --with-libraries=system
            --with-libraries=date_time
            --prefix=<INSTALL_DIR>
	       BUILD_COMMAND
	   b2 install link=static variant=release threading=multi runtime-link=static
        INSTALL_COMMAND ""
        INSTALL_DIR ${boost_INSTALL} )

set( boost_LIBRARY_SUFFIX .lib )

add_library( boost::program_options  STATIC IMPORTED )
set_property( TARGET boost::program_options PROPERTY IMPORTED_LOCATION ${boost_LIB_DIR}/libboost_program_options ${boost_LIBRARY_SUFFIX} )
set_property( TARGET boost::program_options PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${boost_INCLUDE_DIR} )
add_dependencies( boost::program_options  external_boost )


Если попробовать начать установка скачанного boost через консоль в ручную, то сыпятся следующие ошибки
F:\code\C++\tasks\build\boost\src\external_boost\tools\build\src\engine\jam.h(71): fatal error C1034: ctype.h: не указан путь поиска включаемых файлов
compile.c
F:\code\C++\tasks\build\boost\src\external_boost\tools\build\src\engine\jam.h(71): fatal error C1034: ctype.h: не указан путь поиска включаемых файлов
constants.c
debug.c
F:\code\C++\tasks\build\boost\src\external_boost\tools\build\src\engine\jam.h(71): fatal error C1034: ctype.h: не указан путь поиска включаемых файлов
execcmd.c
  • Вопрос задан
  • 269 просмотров
Решения вопроса 1
@klirichek
А зачем эта мышиная возня с ручным импортом?

Я примерно так делал для boost::context


cmake_minimum_required(VERSION 2.8.2)

project(boost-context-download NONE)

include(ExternalProject)

ExternalProject_Add(boost-context
SOURCE_DIR "@BOOST_CONTEXT_SRC@"
BUILD_IN_SOURCE ON
CONFIGURE_COMMAND bootstrap.bat
BUILD_COMMAND b2 --with-context
INSTALL_COMMAND b2 install --with-context --build-type=complete --prefix=@BOOST_CONTEXT_BUILD@
)


Параметры чуть другие, чем у вас (в конфигуратор список либ необязательно. А при билде уже надо. И ещё отдельно установка, где они тоже нужны).
Ещё при сборке желательно удалить (если есть) переменную окружения CXX, если её вдруг определена в проекте выше (у b2 собственная интроспекция, которая этого пугается).

Просто дальше, после сборки external_project - и идёт обычный find_package(Boost 1.61.0 COMPONENTS context), который создаёт все нужные импортированные таргеты. А последующий target_link_libraries(boost::context) их использует.

Но в целом сам подход не совсем хорош. Под винду можно найти готовые сборки буста. Качать примерно столько же, но возиться с установкой уже совершенно не нужно. Распаковал архив, натравил в него BOOST_ROOT, вызвал find_package(boost...) - и вуаля!
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы