我们正在升级到 boost 1.86.0,同时准备操作系统升级。 我无法摆脱未解析的符号:
链接时boost::log::v2s_mt_posix::aux::unhandled_exception_count()。
我们正在从 1.69.0 升级。 目前我们使用的是Centos7,正在准备升级到RHEL 9.4。 我们正在为 Linux x86_64 构建并为 Petalinux aarch64 进行交叉编译。
我正在链接 cmake 文件中指定的 posix 多线程。 这一切在 Boost 1.69.0 和 cmake 3.25.1 下运行良好
我的 CMakeLists.txt 中的设置如下:
cmake_minimum_required(VERSION 3.30.1)
set(CMAKE_TOOLCHAIN_FILE tc-x86_64.cmake)
project(MPDR3)
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_STANDARD 20)
set(CXX_STANDARD 20)
set(CMAKE_C_STANDARD 17)
message("\nBuild type is ${CMAKE_BUILD_TYPE}")
message(CMAKE_CXX_STANDARD = "${CMAKE_CXX_STANDARD}")
message(CMAKE_TOOLCHAIN_FILE = "${CMAKE_TOOLCHAIN_FILE}")
message(CMAKE_C_COMPILER = "${CMAKE_C_COMPILER}") # c++ complier is automatic...
# setup boost...
# we will use static libs
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
set(BOOST_ROOT $ENV{SDR_HOME}/thirdparty/boost_1_86_0/)
find_package(Boost 1.86.0 REQUIRED COMPONENTS log log_setup thread system program_options)
find_package(Threads)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
message(STATUS "Boost version: ${Boost_VERSION}")
set(EIGEN3_ROOT $ENV{SDR_HOME}/thirdparty/eigen/)
find_package (Eigen3 3.4 REQUIRED NO_MODULE)
message("Eigan version: ${Eigan_VERSION}")
include_directories($ENV{SDR_HOME}/thirdparty/eigen/include/eigen3)
<snip>
链接我的可执行文件时出现错误。 我找到的唯一答案是我应该动态链接而不是静态链接。 我两种方式都得到相同的未解决问题。我的默认链接是静态的。
我检查了我的 LD_LIBRARY_PATH,没有发现任何问题。
我尝试过静态和动态链接。 我得到同样的错误。命名空间表明它是一个应该由 boost 日志记录中的某些内容解析的函数,但是当我 grep 例程的源代码时,我什么也没找到。
我尝试更改 log 和 log_setup 的顺序,尝试使用 log_mt...
现在我已经尝试在RHEL9.4下链接。
Boost 日志记录 - 获取未解析的符号 - 这个问题几乎是相同的......但我尝试了两种解决方案,但没有得到不同的结果。
当前的Boost.Log不提供
unhandled_exception_count
功能,已切换为boost::core::uncaught_exceptions
。如果您有未解决的对 unhandled_exception_count
的引用,那么要么您包含了来自仍安装在系统上的较旧 Boost.Log 的标头,要么您的程序的某些部分未使用新的 Boost.Log 重新编译,并且仍然存在取决于旧的Boost。在后一种情况下,您可能正在使用一些针对旧版 Boost 编译的第三方库。如果是这样,您需要使用新的Boost重新编译它。
尝试从系统中删除旧的Boost标头(例如,如果它作为CentOS软件包安装,请尝试删除相应的-devel软件包)。另请注意链接错误,因为它们可能包含包含过时引用的目标文件的名称。这可能会给您一些线索,程序的哪些部分没有用新的 Boost 重新编译。