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)
额外优化建议
- 避免全局设置
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 )
- 启用测试支持并使用官方推荐的测试发现方式:
enable_testing() gtest_discover_tests(run_unittests)
- 替换全局
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
相关产品推荐
相关产品推荐

