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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:50:50