WSL подхватывает путь Windows при использовании CMake

Вопрос или проблема

Я установил googletest в WSL. Я скопировал статические библиотеки gtest в /usr/lib. Затем переместил папки gtest и gmock в /usr/local/include/.

Я написал простую программу для gtest, и она заработала с помощью команды :

g++ -o exec main.cpp -lgtest -lpthread

Но когда я пробую с CMake и make, я получаю ошибки. Что я заметил, так это то, что cmake извлекает путь из Windows.

CMakeLists.txt

cmake_minimum_required(VERSION 3.13)

find_package(GTest REQUIRED)
message("GTest_INCLUDE_DIRS = ${GTest_INCLUDE_DIRS}")

add_executable(my_executable main.cpp)

target_link_libraries(my_executable ${GTEST_LIBRARIES} pthread)

Извлечение пути из Windows в CMakeCache.txt

//Директория, содержащая файл конфигурации CMake для GTest.
GTest_DIR:PATH=/mnt/c/msys64/mingw64/lib/cmake/GTest

Ошибки, которые я получаю :

/usr/bin/ld: /mnt/c/msys64/mingw64/bin/libgtest.dll:(.idata+0xc34): множественное определение `__imp__ZTVNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEE’; /mnt/c/msys64/mingw64/bin/libgtest.dll:(.idata+0xc34): первое определено здесь

main.cpp:(.text+0x91): неопределенная ссылка на testing::Message::Message()' /usr/bin/ld: main.cpp:(.text+0xc0): неопределенная ссылка на testing::internal::AssertHelper::AssertHelper(testing::TestPartResult::Type, char const*, int, char const*)’

.

Ответ или решение

Решение проблемы с CMake и Windows-путями в WSL

В вашей ситуации возникает проблема, связанная с тем, что CMake в Windows Subsystem for Linux (WSL) некорректно находит библиотеки Google Test, и вместо путей WSL использует пути Windows. Это может привести к ошибкам компоновки, которые вы наблюдаете, таким как "multiple definition" и "undefined reference". В данной статье мы рассмотрим, как можно решить вашу проблему.

Шаги для устранения проблемы

1. Убедитесь, что WSL правильно настроен

Это первый и важный шаг. Проверьте, что ваша версия WSL обновлена и что вы используете WSL 2, так как она предлагает значительные улучшения по сравнению с WSL 1 в плане совместимости и производительности.

2. Очистка CMakeCache

Чтобы избежать конфликта с кэшированными значениями, выполните следующие действия:

  1. Перейдите в каталог вашего проекта, где находится файл CMakeLists.txt.
  2. Удалите файл CMakeCache.txt и директорию CMakeFiles, чтобы сбросить состояние CMake:
    rm -rf CMakeCache.txt CMakeFiles

3. Установка переменных окружения

Итак, нам нужно сообщить CMake, где найти ваши библиотеки Google Test в WSL. Добавьте следующее в вашу CMakeLists.txt перед вызовом find_package:

set(GTEST_ROOT "/usr/local/include")
set(GTest_DIR "/usr/lib/cmake/GTest")

Это поможет CMake найти библиотеки в вашей WSL, а не в любом другом месте.

4. Используйте правильные команды для CMake

Теперь, когда вы настроили пути, скомпилируйте проект с помощью следущих команд:

mkdir build
cd build
cmake ..
make

Это гарантирует, что CMake будет использовать правильные пути во время сборки.

5. Убедитесь в отсутствии конфликтующих библиотек

Проверьте, не установлен ли gtest через пакетный менеджер (например, apt), поскольку это может привести к конфликтам версий. Если так, вам нужно удалить его:

sudo apt remove libgtest-dev

Затем вы можете заново установить библиотеки (если это необходимо) и убедиться, что используете правильные версии библиотек и заголовков.

6. Проверка путей в CMakeCache.txt

После применения всех вышеуказанных шагов, взгляните на CMakeCache.txt, чтобы удостовериться, что CMake использует верные пути. Ищите строки, начинающиеся с GTest_DIR и GTEST_LIBRARIES, и убедитесь, что они указывают на ваши библиотеки в /usr/..., а не в /mnt/....

Заключение

Следуя приведенным выше шагам, вы должны устранить проблемы, связанные с неверными путями в CMake, а также успешно собрать ваш проект с использованием Google Test. Если проблема не решается, убедитесь в зависимости от других настроек вашего проекта и конфигураций системных переменных.

При возникновении дополнительных вопросов или проблем, не стесняйтесь задавать их, и я буду рад помочь вам в дальнейшем!

Оцените материал
Добавить комментарий

Капча загружается...