LD_LIBRARY_PATH指向已安装库时,如何让C++测试链接构建目录库
问题:测试程序链接到已安装库而非本地构建库
我正在开发一个通过设置export LD_LIBRARY_PATH=...完成安装的项目。开发阶段遇到的问题是,编译后的测试文件会链接到已安装的库,而非当前编译的本地构建库。由于项目依赖LD_LIBRARY_PATH中的另一个项目,无法通过取消设置该路径来进行测试。
此前查找过相关问题但未能解决:
- CMake: link test with library in build directory, not with installed version
- gtest is linking to an installed library
可复现的项目结构
./CMakeLists.txt ./src/libA.cpp ./src/CMakeLists.txt ./include/libA.hpp ./test/test_libA.cpp ./test/CMakeLists.txt
各文件内容
CMakeLists.txt
cmake_minimum_required(VERSION 3.19) project( LibraryTest VERSION 0.1 LANGUAGES CXX) add_subdirectory(src) enable_testing() add_subdirectory(test) install( TARGETS ${PROJECT_NAME}Lib EXPORT ${PROJECT_NAME}Targets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) install( EXPORT ${PROJECT_NAME}Targets FILE ${PROJECT_NAME}Targets.cmake NAMESPACE ${PROJECT_NAME}:: DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/cmake)
include/libA.hpp
#pragma one bool foo();
src/CMakeLists.txt
add_library( ${PROJECT_NAME}Lib SHARED libA.cpp) target_include_directories( ${PROJECT_NAME}Lib PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/>) add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME}Lib )
src/libA.cpp
#include "libA.hpp" bool foo() { return true; }
test/CMakeLists.txt
# Download GTest include(FetchContent) option(INSTALL_GTEST "Enable installation of googletest." OFF) FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest GIT_TAG v1.13.0) FetchContent_MakeAvailable(googletest) include(GoogleTest) # Add test add_executable(test_libA test_libA.cpp) target_link_libraries( test_libA ${PROJECT_NAME}::${PROJECT_NAME} GTest::gtest_main GTest::gtest GTest::gmock ) gtest_add_tests(TARGET test_libA)
test/test_libA.cpp
#include "libA.hpp" #include <gtest/gtest.h> TEST(libA, dummy) { EXPECT_TRUE(foo()); } int main(int argc, char *argv[]) { ::testing::InitGoogleTest(&argc, argv); auto result = RUN_ALL_TESTS(); return result; }
构建步骤
使用cmake 3.22.1和g++ 12.1.0执行以下命令:
mkdir build cd build cmake .. make make install
ldd命令输出
ldd test/test_libA libLibraryTestOut.so => $LD_LIBRARY_PATH/lib/libLibraryTestLib.so
内容的提问来源于Stack Exchange,提问作者TillLeiden
相关产品推荐
相关产品推荐

