私は CMake の経験がないので、ここで完全に間違っていることがあれば申し訳ありません。
CMakeLists.txt:
INCLUDE_DIRECTORIES(BEFORE
${PROJECT_SOURCE_DIR}/src
${CMAKE_INSTALL_PREFIX}/include
${CMAKE_INSTALL_PREFIX}/include/sensor
${CMAKE_INSTALL_PREFIX}/include/valijson
)
FIND_LIBRARY(FMT_LIB NAMES fmt fmtd HINTS "${CMAKE_INSTALL_PREFIX}/lib")
FIND_LIBRARY(SENSOR_LIB sensor HINTS "${CMAKE_INSTALL_PREFIX}/lib")
ADD_EXECUTABLE(${PROJECT_NAME}
src/check_dummy.h
src/check_dummy.cpp
)
INCLUDE("${SENSORINFRA_PREFIX}/cmake/sensor_main.cmake")
INCLUDE("${SENSORINFRA_PREFIX}/cmake/sensor_schemata.cmake")
TARGET_LINK_LIBRARIES(${PROJECT_NAME}
${FMT_LIB}
${SENSOR_LIB}
)
INSTALL(TARGETS ${PROJECT_NAME}
DESTINATION sensors
)
IF (BUILD_TESTS)
MESSAGE(STATUS "Building tests")
ENABLE_TESTING()
ADD_SUBDIRECTORY(test)
ADD_TEST(NAME ${PROJECT_NAME}_tests COMMAND test/${PROJECT_NAME}_tests)
ENDIF (BUILD_TESTS)
この部分がすべて機能するまで、googletest を使用してテストを追加してみました。
「test」という名前の内部ディレクトリを追加しました。これが CMakeLists.txt です。
CMAKE_MINIMUM_REQUIRED(VERSION 3.15)
PROJECT(checkdummytests_tests LANGUAGES CXX)
SET(CMAKE_CXX_STANDARD 11)
ADD_COMPILE_DEFINITIONS(CHECKDUMMY_SENSOR_TEST SENSOR_TEST)
SET(GOOGLETEST_PATH "../../BUILD/external_sources/src/googletest")
FIND_LIBRARY(SENSOR_LIB sensor HINTS "${CMAKE_INSTALL_PREFIX}/lib")
INCLUDE_DIRECTORIES(BEFORE
${CMAKE_INSTALL_PREFIX}/include/sensor
${FMT_PATH}/include/
${LOGGER_PATH}/src/
${PROJECT_SOURCE_DIR}/../src/
)
ADD_SUBDIRECTORY("${GOOGLETEST_PATH}/" [EXCLUDE_FROM_ALL])
ADD_EXECUTABLE(${PROJECT_NAME}
gtest_main.cpp
../src/check_dummy.h
**../src/check_dummy.cpp**
src/check_dummy_test_mock.h
src/ut_first_test.cpp
)
TARGET_LINK_LIBRARIES(${PROJECT_NAME}
gtest
gmock
${SENSOR_LIB}
)
太字の行 (../src/check_dummy.cpp) に注目してください。これは私のプロジェクトのメインの cpp ファイルであり、明らかにテストに使用する必要があります。残念ながら、それをexeに追加することはできません。それがなくても動作し(この行をコメントアウトすると)、コンパイルできます(ASSERT_EQ(true、true)のみを実行する現在のテストもパスします)。
しかし、その行のコメントを外してその cpp ファイルを追加すると、次のエラーが発生します。
check_dummy.obj : error LNK2019: unresolved external symbol "public: virtual class rapidjson::GenericDocument<struct rapidjson::UTF8<char>,class rapidjson::MemoryPoolAllocator<class rapidjson::CrtAllocator>,class rapidjson::CrtAllocator> const & __cdecl x::sensors::CheckDummySensor::getQueriesSchema(void)const " (?getQueriesSchema@CheckDummySensor@sensors@x@@UEBAAEBV?$GenericDocument@U?$UTF8@D@rapidjson@@V?$MemoryPoolAllocator@VCrtAllocator@rapidjson@@@2@VCrtAllocator@2@@rapidjson@@XZ) referenced in function "public: __cdecl x::sensors::CheckDummySensor::CheckDummySensor(void)" (??0CheckDummySensor@sensors@x@@QEAA@XZ) [C:\si\sensors\checkdummytests\cmake-build-relwithdebinfo\test\checkdummytests_tests.vcxproj]
check_dummy.obj : error LNK2019: unresolved external symbol "public: virtual class rapidjson::GenericDocument<struct rapidjson::UTF8<char>,class rapidjson::MemoryPoolAllocator<class rapidjson::CrtAllocator>,class rapidjson::CrtAllocator> const & __cdecl x::sensors::CheckDummySensor::getSessionSchema(void)const " (?getSessionSchema@CheckDummySensor@sensors@x@@UEBAAEBV?$GenericDocument@U?$UTF8@D@rapidjson@@V?$MemoryPoolAllocator@VCrtAllocator@rapidjson@@@2@VCrtAllocator@2@@rapidjson@@XZ) referenced in function "public: __cdecl x::sensors::CheckDummySensor::CheckDummySensor(void)" (??0CheckDummySensor@sensors@x@@QEAA@XZ) [C:\si\sensors\checkdummytests\cmake-build-relwithdebinfo\test\checkdummytests_tests.vcxproj]
最初の で同じファイルをコンパイルする可能性があることに注意してくださいCMakeList.txt
。何らかの理由で「test」ディレクトリ内のファイルでのみ機能しません。