我在一个项目上工作,它是通过定义export LD_DIBRARY_PATH=...
来安装的。我的问题是,当我开发时,编译的测试文件链接到已安装的库,而不是当前编译的库。我的项目依赖于我的LD_DIBRARY_PATH
中的另一个项目,所以我不能取消测试路径。
我发现了以下问题,但是他们无法帮助我:
- CMake:链接测试库在构建目录,而不是安装版本
- gtest正在链接到已安装的库
我可以用下面的例子复制它:
./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;
}
Building withcmake 3.22.1
andg++ 12.1.0
:
mkdir build
cd build
cmake ..
make
make install
ldd
将产生以下输出
ldd test/test_libA
libLibraryTestOut.so => $LD_LIBRARY_PATH/lib/libLibraryTestLib.so
所以我不能取消测试路径
哦,不,你可以。每个进程都有自己的环境(一组环境变量)。您可以将LD_LIBRARY_PATH
环境变量设置为已安装库的路径已删除的版本,或者将您的库的构建目录版本设置为比已安装的版本具有更高优先级(在列表中较早显示)的版本。
你可以使用你的shell机制来设置进程的环境变量(比如Bash,你可以在命令行开始设置变量),或者使用你的系统命令(例如env
),或者使用CMake的跨平台替代(cmake -E env
),或者如果你使用CTest,使用ENVIRONMENT
测试属性,或者如果你额外使用CMake预设,使用environment
字段的测试预设。
但事实上,您首先使用它进行安装并不是很好。引用自Linux文档项目:
LD_LIBRARY_PATH
便于开发和测试,但不应通过安装过程修改以供普通用户正常使用;参见"为什么LD_LIBRARY_PATH是坏的";请登录http://www.visi.com/~barr/ldpath.html了解原因。但对于开发或测试,以及解决无法解决的问题,它仍然是有用的。
您可以停止这样做,而是使用系统的其他机制,如PATH
环境变量或RPATH
。