链接HPX库的C++程序启动报错:找不到_at_quick_exit符号
问题:HPX程序运行时出现
_at_quick_exit符号未找到错误 我已通过vcpkg构建HPX库及所有必要依赖,编写了使用hpx命名空间的简单“Hello World”程序,但经CMake构建并运行时出现以下错误:
dyld[89445]: Symbol not found: _at_quick_exit Referenced from: <8100FA25-26C8-340E-8164-664638E7C528> /Users/shlokjain/CLionProjects/Matrix/cmake-build-debug/Matrix Expected in: <B5E49904-EFC0-3BB7-9156-0C6811B8C533> /usr/lib/libSystem.B.dylib
相关文件内容
CMakeLists.txt
cmake_minimum_required(VERSION 3.30) project(Matrix) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") find_package(HPX REQUIRED) add_executable(Matrix main.cpp) target_link_libraries(Matrix HPX::hpx HPX::wrap_main HPX::iostreams_component)
main.cpp
#include <iostream> #include <hpx/iostream.hpp> int main() { hpx::cout << "Hello World!\n" << std::flush; return 0; }
CMake构建选项
-DHPX_DIR:PATH=/path/to/hpx/installation/lib/cmake/HPX -DCMAKE_CXX_FLAGS="-stdlib=libc++"
补充信息
- 系统配置:2020款M1 Pro,macOS版本14.5
- 执行
otool -L ./matrix_mult的输出:
/opt/homebrew/opt/open-mpi/lib/libmpi.40.dylib (compatibility version 81.0.0, current version 81.7.0) /opt/homebrew/opt/hwloc/lib/libhwloc.15.dylib (compatibility version 25.0.0, current version 25.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1351.0.0) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1800.105.0)
输出未提及关键依赖Boost,这可能引发链接问题。
可能原因及解决方案
1. C++标准库不一致
_at_quick_exit是GNU libstdc的专属符号,而你指定了用LLVM的libc++编译程序。如果HPX或其依赖(如Boost)是用libstdc编译的,就会出现符号不匹配。
- 解决:强制vcpkg用libc++重新构建HPX及所有依赖:
export VCPKG_CXX_FLAGS="-stdlib=libc++" export VCPKG_C_FLAGS="-stdlib=libc++" vcpkg install hpx
2. Boost依赖未正确链接
otool输出中没有Boost库,说明链接阶段未正确引入HPX的依赖Boost。虽然find_package(HPX REQUIRED)理论上会自动处理,但可能因配置失效导致问题。
- 解决:在CMakeLists.txt中显式添加Boost依赖检查:
同时确认find_package(Boost REQUIRED) target_link_libraries(Matrix PRIVATE Boost::boost)HPX_DIR指向的是vcpkg安装路径下的HPX配置目录,避免引用到其他版本的HPX。
3. 架构不匹配
M1 Pro是ARM64架构,若构建HPX时使用了x86_64架构(比如通过Rosetta运行vcpkg),会导致运行时符号不兼容。
- 解决:指定ARM64架构重新构建HPX:
同时在CMake构建时添加vcpkg install hpx --triplet arm64-osx-DCMAKE_OSX_ARCHITECTURES=arm64,确保目标架构一致。
4. HPX构建配置错误
HPX的某些编译选项可能强制依赖GNU扩展,导致引入_at_quick_exit符号。
- 解决:重新构建HPX时明确指定C++标准和标准库:
vcpkg install hpx --cmake-args "-DCMAKE_CXX_STANDARD=20" "-DCMAKE_CXX_FLAGS=-stdlib=libc++"
内容的提问来源于stack exchange,提问作者Shlok Jain
相关产品推荐
相关产品推荐

