- Вопрос или проблема
- Ответ или решение
- Решение проблемы с CMake и Windows-путями в WSL
- Шаги для устранения проблемы
- 1. Убедитесь, что WSL правильно настроен
- 2. Очистка CMakeCache
- 3. Установка переменных окружения
- 4. Используйте правильные команды для CMake
- 5. Убедитесь в отсутствии конфликтующих библиотек
- 6. Проверка путей в CMakeCache.txt
- Заключение
Вопрос или проблема
Я установил 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
Чтобы избежать конфликта с кэшированными значениями, выполните следующие действия:
- Перейдите в каталог вашего проекта, где находится файл
CMakeLists.txt
. - Удалите файл
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. Если проблема не решается, убедитесь в зависимости от других настроек вашего проекта и конфигураций системных переменных.
При возникновении дополнительных вопросов или проблем, не стесняйтесь задавать их, и я буду рад помочь вам в дальнейшем!