У меня есть простой проект CMake + Qt + GTest:
.
├── CMakeLists.txt
├── src
│ ├── CMakeLists.txt
│ ├── main.cpp
│ └── utils
│ ├── calculator.cpp
│ └── calculator.h
└── tests
├── calculator_test.cpp
└── CMakeLists.txt
Корневой CMakeFiles.txt
cmake_minimum_required(VERSION 3.5)
project(random_project)
# Place binaries and libraries according to GNU standards.
include(GNUInstallDirs)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
# Add source folder.
add_subdirectory(src)
# Add GTest.
include(cmake/googletest.cmake)
fetch_googletest(
${PROJECT_SOURCE_DIR}/cmake
${PROJECT_BINARY_DIR}/googletest
)
enable_testing()
# Add tests folder.
add_subdirectory(tests)
И я хочу достичь Calculator.h в Calculator_test.cpp, который использует GTest:
#include <gtest/gtest.h>
#include "utils/calculator.h" // <- Want to reach this in that path format.
TEST(example, add)
{
EXPECT_EQ(8, Calculator::sum(3, 5));
}
Я попытался связать, но затем тест не найден, и путь является относительным:
тесты / CMakeFiles.txt
# Find the Qt libraries.
find_package(Qt5Widgets REQUIRED)
# Qt5 libraries.
set(QT5_LIBRARIES
Qt5::Widgets)
# Source files.
set(SOURCE_FILES
calculator_test.cpp
../src/utils/calculator.cpp
../src/utils/calculator.h
../src/main.cpp) # If I link like this, test is not found.
# Tell CMake to create the executable.
add_executable(unit_tests ${SOURCE_FILES})
# Use the Widgets module from Qt5.
target_link_libraries(unit_tests ${QT5_LIBRARIES} gtest_main)
# Add tests.
add_test(
NAME unit_tests
COMMAND ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}/unit_tests
)
Как связать Calculator.h в тесте Calculator_test.cpp с CMakeLists.txt?





My Qt project with CMake project file cannot resolve the path to "someHeader.h". What can I do to fix it?
Вы можете указать путь включения:
include_directories("${PROJECT_SOURCE_DIR}/relativePathToHeader")
и, вероятно, путь нужен:
include_directories("${PROJECT_SOURCE_DIR}/src/utils") или может быть
include_directories("${PROJECT_SOURCE_DIR}/utils") в зависимости от того, где на самом деле находится исходный каталог.
Конечно, вам нужно перезапустить CMake.
Блестяще! Является ли хорошей практикой include_directories("${PROJECT_SOURCE_DIR}/src"), а затем устанавливать исходные файлы также с помощью переменной PROJECT_SOURCE_DIR? То есть set(SOURCE_FILES calculator_test.cpp ${PROJECT_SOURCE_DIR}/src/utils/calculator.cpp). Или до calculator.cpp теперь можно было добраться иначе?
Часто так делают, но не правило. Может зависеть от проекта. Рад, что сработало для вас.
Вы путаете термины: под «связыванием» мы подразумеваем связывание объектных файлов (вывод компилятора) друг с другом для создания результирующего двоичного исполняемого файла. Я могу только предположить, что в вашем случае компилятор не может найти «Calculator.h» при компиляции «Calculator_test.cpp», что можно исправить, указав путь включения. Проблема заключается в том, что среда компилятора настроена в файле проекта.