You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake编译C++项目遇nextafter符号未定义错误求助

问题:CMake配置GoogleTest时链接失败,提示nextafter@@GLIBC_2.2.5未定义

错误输出

-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: /home/ryan/src/out
[ 15%] Built target gtest
[ 30%] Built target gtest_main
[ 53%] Built target cpp_utils
[ 69%] Built target gmock
[ 84%] Built target gmock_main
[ 92%] Linking CXX executable run_unittests
/usr/bin/ld: lib/libgtest.a(gtest-all.cc.o): undefined reference to symbol 'nextafter@@GLIBC_2.2.5'
/usr/bin/ld: /lib/x86_64-linux-gnu/libm.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
gmake[3]: *** [CMakeFiles/run_unittests.dir/build.make:101: run_unittests] Error 1
gmake[2]: *** [CMakeFiles/Makefile2:237: CMakeFiles/run_unittests.dir/all] Error 2
gmake[1]: *** [CMakeFiles/Makefile2:244: CMakeFiles/run_unittests.dir/rule] Error 2
gmake: *** [Makefile:182: run_unittests] Error 2

已尝试的方法

  • 使用target_link_libraries(run_unittests gtest_main gmock_main m stdc++)链接数学库
  • 使用target_link_libraries(run_unittests gtest_main gmock_main -lm stdc++)链接数学库
  • 在CMAKE_CXX_FLAGS中添加-lm -ldl
  • 使用target_link_libraries(gtest_main INTERFACE m stdc++)为gtest/gmock添加依赖
  • 显式添加pthread作为依赖

解决步骤

问题核心是GoogleTest静态库依赖数学库libm,但链接顺序或依赖关联方式错误导致符号无法解析。以下是两种可行方案:

方案1:为GoogleTest目标直接添加libm依赖

在根目录CMakeLists.txt的add_subdirectory(third_party)之后,添加以下代码,让gtest/gmock的所有依赖目标都自动关联libm:

# 为gtest系列目标添加libm依赖
target_link_libraries(gtest INTERFACE m)
target_link_libraries(gtest_main INTERFACE m)
target_link_libraries(gmock INTERFACE m)
target_link_libraries(gmock_main INTERFACE m)

然后修改测试可执行文件的链接语句,无需再显式声明m:

target_link_libraries(run_unittests gtest_main gmock_main cpp_utils)

方案2:调整链接顺序并使用现代CMake语法

直接修改测试可执行文件的链接规则,确保libm在依赖链中处于正确位置:

target_link_libraries(run_unittests
    PRIVATE
        cpp_utils
        gtest_main
        gmock_main
        m
)

如果你的cpp_utils库本身也用到数学函数,同样需要为其添加libm依赖:

target_link_libraries(cpp_utils PRIVATE m)

额外优化建议

  1. 避免全局设置CMAKE_CXX_FLAGS,改用target_compile_options为具体目标添加编译参数,更符合CMake最佳实践:
target_compile_options(cpp_utils PRIVATE
    -g2 -O2 -Wall -Werror -Wpointer-arith -finline-functions
    -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables
    -Wno-sign-compare -Wformat-security -Wstrict-aliasing -Wcast-align
    -Wmissing-field-initializers
)
  1. 启用测试支持并使用官方推荐的测试发现方式:
enable_testing()
gtest_discover_tests(run_unittests)
  1. 替换全局include_directories为目标级别的target_include_directories,避免污染全局路径:
target_include_directories(run_unittests PRIVATE
    ${PROJECT_SOURCE_DIR}
    ${PROJECT_SOURCE_DIR}/third_party/googletest/googletest/include
    ${PROJECT_SOURCE_DIR}/third_party/googletest/googlemock/include
)

验证方法

重新执行CMake配置与构建:

cd /home/ryan/src/out
cmake ..
make run_unittests

内容的提问来源于stack exchange,提问作者user5859728

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:52:10