我决定尝试 boost::stacktrace 并从 boost 文档中复制了最简单的示例。我正在使用 qt-creator 4.8、Cmake 3.10、GCC 7.3、boost 1.69.0。
编码:
#include <boost/stacktrace.hpp>
#include <iostream>
void Foo() {
std::cout << boost::stacktrace::stacktrace() << std::flush << std::endl;
}
int main() {
Foo();
return 0;
}
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})
add_executable(${PROJECT_NAME} "main.cpp")
target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})
在编译期间,编译器会抛出四个错误:
/.../main.cpp.o:-1: 在函数`boost::stacktrace::detail::to_string[abi:cxx11](boost::stacktrace::frame const*, unsigned long)'中:
/.../main.cpp:-1: error: undefined reference to `dladdr'
/.../main.cpp:-1: error: undefined reference to `dladdr'
:-1: 错误: collect2: 错误: ld 返回 1 退出状态
据我所知 boost::stacktrace 是一个 hederonly 库,我不知道问题是什么?
升级版:
在讨论中,出现了一个问题,这个库是 hederonly 吗?我提供了一个链接,指向文档中规定这一时刻的地方。
在杀死了很多时间之后,我解决了这个问题。一般来说,事实证明,在 GNU 上使用 boost::stacktrace 构建一些东西需要一个 DL 库(感谢@VTT 的提示)。但是为了让CMake能够正常组装一切,需要在target_link_libraries中添加${CMAKE_DL_LIBS}变量(同时-ldl编译标志的有无不影响任何东西,不知道为什么)。最终脚本如下所示: