#c #cmake #linker #googletest
#c #cmake #компоновщик #googletest
Вопрос:
Я использую 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
Я могу добавить путь к своим пользовательским библиотекам GCC, используя LD_LIBRARY_PATH, тогда связывание сработает, но я хотел бы найти решение, которое позволит мне указать в cmake, где искать эти библиотеки при связывании тестов.
Также пробовал обновление до cmake 3.18, которое дало те же результаты. Любые советы будут оценены, спасибо!
Комментарии:
1. проверьте свой make VERBOSE = 1 и посмотрите, какова строка ссылки
2. @kobi при использовании VERBOSE = 1 я вижу команду cmake, упомянутую выше (последний раздел кода), а не фактические команды компоновки. Это происходит только с модулем gtest cmake. Я углублюсь в этот модуль gtest cmake.
3. это странно. вы должны увидеть команду link.
Ответ №1:
TL; DR проблема решена, когда я попросил CMake использовать установочный RPATH в процессе сборки с помощью
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
Еще несколько деталей:
Модуль CMake GTest запускает исполняемый файл для перечисления тестов после того, как он был связан во время make
(не совсем уверен, почему). Это сбой, потому что на этом этапе RPATH для установки еще не был установлен. Он устанавливается только во время make install
Чтобы преодолеть это, вы можете попросить CMake добавить установочный RPATH во время сборки.