如何将链接器目录添加到cmake gtest_discover_tests

问题描述

我在项目中使用cmake和gtest。 我的gtest可执行文件使用的名称与程序可执行文件的名称相同。我知道这不是理想的选择,但我无法更改。

我正在使用的编译器安装在与系统GCC(较旧)不同的目录中。 我已经使用以下命令设置了编译器路径:

set(CMAKE_C_COMPILER /opt/gcc-5.4.0/bin/gcc-5.4.0)
set(CMAKE_CXX_COMPILER /opt/gcc-5.4.0/bin/g++-5.4.0)

链接可执行文件时,我使用的是target_link_directories:

target_link_directories(target PUBLIC /opt/gcc-5.4.0/lib /opt/gcc-5.4.0/lib64)

没有gtest,目标可以正确编译,链接并运行,但是在添加gtest时:

  gtest_discover_tests(target WORKING_DIRECTORY <gtests_soruce_dir>)

gtest目标无法链接:

target: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by executable_name)
target: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by executable_name)
target: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by executable_name)
target: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by executable_name)

CMake Error at /home/gilkalish/.local/share/JetBrains/Toolbox/apps/CLion/ch-0/202.6397.106/bin/cmake/linux/share/cmake-3.17/Modules/GoogleTestAddTests.cmake:40 (message):
  Error running test executable.

    Path: 'executable_path'
    Result: 1
    Output:

链接可执行文件之后,这是链接gtest的最后一步。

/usr/bin/cmake3 -D TEST_TARGET=target -D TEST_EXECUTABLE=<target_path>/target -D TEST_EXECUTOR= -D TEST_WORKING_DIR=<test_path> -D TEST_EXTRA_ARGS= -D TEST_PROPERTIES= -D TEST_PREFIX= -D TEST_SUFFIX= -D NO_PRETTY_TYPES=FALSE -D NO_PRETTY_VALUES=FALSE -D TEST_LIST=target_TESTS -D CTEST_FILE=target[1]_tests.cmake -D TEST_DISCOVERY_TIMEOUT=5 -P 

我可以使用LD_LIBRARY_PATH将路径添加到自定义GCC库中,然后进行链接,但是我想找到一种解决方案,允许我在cmake中指定链接测试时在哪里寻找该库。

还尝试更新到cmake 3.18,得到相同的结果。 任何提示将不胜感激,谢谢!

解决方法

TL;DR 问题在我要求 CMake 在构建过程中使用安装 RPATH 时解决了

set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)

更多细节: CMake GTest 模块正在运行可执行文件以在 make 期间链接后枚举测试(不太清楚为什么)。这是失败的,因为此时尚未设置安装 RPATH。它仅在 make install 期间设置 为了克服这个问题,您可以要求 CMake 在构建期间添加安装 RPATH。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...