GTest无法加载导入共享库问题求助(CMake+Ubuntu环境)
共享库依赖问题:GTest测试构建失败但手动测试正常
构建GTest测试可执行文件时出现以下错误:
<构建目录路径>/test_gtest: error while loading shared libraries: ./libDependencyL2.so: cannot open shared object file: No such file or directory CMake Error at /usr/share/cmake-3.24/Modules/GoogleTestAddTests.cmake:112 (message): Error running test executable. Path: '<构建目录路径>/test_gtest/test_gtest' Result: 127 Output: Call Stack (most recent call first): /usr/share/cmake-3.24/Modules/GoogleTestAddTests.cmake:225 (gtest_discover_tests_impl)环境:x86架构Ubuntu 20.04,CMake构建系统
项目结构
test_project/ CMakeLists.txt src/ test_handcrafted/ CMakeLists.txt test_handcrafted.cpp test_gtest/ CMakeLists.txt test_gtest.cpp test_utils CMakeLists.txt test_utils.cpp test_utils.hpp lib/ libTarget.so Target.hpp libDependencyLevel1.so DependencyLevel1.hpp libDependencyLevel2.so DependencyLevel2.hpp build/
说明:libTarget.so是待测试的功能库,libDependencyLevel1.so是测试结果可视化工具(依赖libDependencyLevel2.so),test_utils包含测试实际调用的所有函数与类。
依赖检查结果
执行ldd libDependencyLevel1.so输出:
linux-vdso.so.1 (0x00007fff17bb6000) libDependencyLevel2.so => not found libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fe5f3357000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fe5f333c000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe5f314a000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe5f2ffb000) /lib64/ld-linux-x86-64.so.2 (0x00007fe5f358d000)
构建test_handcrafted后,执行ldd test_handcrafted输出:
linux-vdso.so.1 (0x00007ffdaa561000) libTarget.so => <仓库目录路径>/lib/libTarget.so (0x00007ff7ab7ab000) ../lib/libDependencyLevel1.so (0x00007ff7ab76d000) ../lib/libDependencyLevel2.so (0x00007ff7ab612000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff7ab3e5000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff7ab294000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff7ab279000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff7ab087000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff7ab064000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff7ab05e000) ./libDependencyLevel2.so => not found libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007ff7ab040000) libjpeg.so.8 => /lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007ff7aafbb000) /lib64/ld-linux-x86-64.so.2 (0x00007ff7ac01b000)
CMake配置文件
test_project/CMakeLists.txt
project(MY_TEST) cmake_minimum_required(VERSION 3.22) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) include(ExternalProject) add_library(libTarget SHARED IMPORTED) set_target_properties(libTarget PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/lib/libTarget.so" ) add_library(libDependencyLevel2 SHARED IMPORTED) set_target_properties(libDependencyLevel2 PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/lib/libDependencyLevel2.so" ) add_library(libDependencyLevel1 SHARED IMPORTED) set_target_properties(libDependencyLevel2 PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/lib/libDependencyLevel2.so" ) add_dependencies(libDependencyLevel1 libDependencyLevel2) include(FetchContent) FetchContent_Declare( googletest URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip ) set(MY_LIBRARIES_HEADERS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/test_utils) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/test_handcrafted) # add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/test_gtest) # 取消注释此行会导致构建错误
src/test_utils/CMakeLists.txt
cmake_minimum_required(VERSION 3.22) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_library(test_utils test_utils.cpp) target_include_directories(test_utils PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} MY_LIBRARIES_HEADERS_DIR ) target_link_libraries(test_utils PUBLIC libTarget libDependencyLevel1 libDependencyLevel2)
src/test_handcrafted/CMakeLists.txt
cmake_minimum_required(VERSION 3.22) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_executable(test_handcrafted test_handcrafted.cpp) target_link_libraries(test_handcrafted PRIVATE libTarget test_utils)
src/test_gtest/CMakeLists.txt
cmake_minimum_required(VERSION 3.22) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_executable(test_gtest test_gtest.cpp) target_link_libraries(test_gtest PRIVATE libTarget test_utils GTest::gtest_main) include(GoogleTest) gtest_discover_tests(test_gtest)
已尝试的无效解决方案
- 在
test_project/CMakeLists.txt中为libDependencyLevel1添加依赖:target_link_libraries(libDependencyLevel1 PUBLIC libDependencyLevel2) # 也尝试过INTERFACE和PRIVATE修饰符 - 在
test_project/CMakeLists.txt中添加链接目录:link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)
疑问与求助
为什么手动测试可执行文件能正常运行,但启用GTest测试时构建系统找不到共享库?两类可执行文件导入共享库的方式一致,差异原因是什么?该如何解决GTest测试的构建问题?
内容的提问来源于stack exchange,提问作者tuscasp
相关产品推荐
相关产品推荐

