Пишу проект под linux с использованием GCC и CMake. Для правильной работы boost::stacktrace понадобилось подключить библиотеку libbacktrace. Как это сделать в CMake?
Пробовал так:
find_library (BACKTRACE_LIBRARY libbacktrace)
target_link_libraries(${BACKTRACE_LIBRARY})
cmake_minimum_required(VERSION 3.10)
project(fast_test_3)
add_definitions(-DBUILD_TYPE_="${CMAKE_BUILD_TYPE}")
add_definitions(-DPROJECT_NAME_="${PROJECT_NAME}")
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pthread ") #
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -Wall -pthread -g -DDREAL_DEBUG -DDREAL_TRACE -fno-inline")
set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS} -Wall -pthread -Os -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -Wall -pthread -O3 -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS} -Wall -pthread -O2 -g")
set (Boost_USE_STATIC_LIBS ON)
set (Boost_USE_MULTITHREADED OFF)
find_package(Boost REQUIRED system)
include_directories (SYSTEM ${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARIES})
#------------ Подключение Backtrace -------------------
find_package(Backtrace REQUIRED)
include_directories(${Backtrace_INCLUDE_DIRS})
#-----------------------------------------------------
add_executable(${PROJECT_NAME} "main.cpp" "foo.h" "foo.cpp")
target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${Backtrace_LIBRARIES})
Модуль FindBacktrace создает переменные:
Backtrace_FOUND
- признак того, что библиотека найденаBacktrace_INCLUDE_DIRS
- путь к заголовочным файламBacktrace_LIBRARIES
- флаги линковщикаМожно наипсать что-то вроде этого:
find_package(Backtrace)
if(NOT Backtrace_FOUND)
message(FATAL_ERROR "Backtrace is not found")
endif()
target_link_libraries(MyTraget PUBLIC ${Backtrace_LIBRARIES})
target_include_directories(MyTraget PUBLIC ${Backtrace_INCLUDE_DIRS})
Хотя это, конечно, одноразовое решение. Если у вас миллион таргетов, то можно один раз создать интерфейсную библиотеку:
find_package(Backtrace)
if(NOT Backtrace_FOUND)
message(FATAL_ERROR "Backtrace is not found")
endif()
add_library(Backtrace INTERFACE)
target_link_libraries(Backtrace INTERFACE ${Backtrace_LIBRARIES})
target_include_directories(Backtrace INTERFACE ${Backtrace_INCLUDE_DIRS})
А потом использовать ее так:
target_link_libraries(MyTraget PUBLIC Backtrace)
PS: Код писал в браузере, могут быть ошибки.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Когда я пользуюсь некоторыми приложениями, где играет музыка или видео, то когда хочу изменить громкость хард кнопками - вместо громкости...
Есть рест - сервис, принимающий xml и обрабатывающий его библиотекой jaxbДля одного из полей написан адаптер для даты: