Как в CMake подключить библиотеку libbacktrace?

98
14 августа 2019, 04:10

Пишу проект под linux с использованием GCC и CMake. Для правильной работы boost::stacktrace понадобилось подключить библиотеку libbacktrace. Как это сделать в CMake?

Пробовал так:

find_library (BACKTRACE_LIBRARY libbacktrace) 
target_link_libraries(${BACKTRACE_LIBRARY})

Upd: Ниже будет находится актуальный CMake скрипт которым я пытаюсь собрать проект.

    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})
Answer 1

Модуль 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: Код писал в браузере, могут быть ошибки.

READ ALSO
Освобождается ли куча от массива

Освобождается ли куча от массива

Пусть у меня есть следующая функция:

108
android изменение громкости “профиль звука”

android изменение громкости “профиль звука”

Когда я пользуюсь некоторыми приложениями, где играет музыка или видео, то когда хочу изменить громкость хард кнопками - вместо громкости...

107
Java stream api

Java stream api

есть такой метод

131
Как избежать того, чтобы формат даты изменялся и дописывалось смещение +03:00?

Как избежать того, чтобы формат даты изменялся и дописывалось смещение +03:00?

Есть рест - сервис, принимающий xml и обрабатывающий его библиотекой jaxbДля одного из полей написан адаптер для даты:

99