Информация
Файл CMakeLists h3>
Код: Выделить всё
cmake_minimum_required(VERSION 3.25)
project(BetBot VERSION 2.1 DESCRIPTION "A simple discord bot to handle friendly bets.")
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
# Main Executable
add_executable(${PROJECT_NAME}
"src/main.cpp"
"src/AddBetCommand.cpp"
"src/AddBetCommand.h"
"src/AddMatchCommand.cpp"
"src/AddMatchCommand.h"
"src/AddResultCommand.cpp"
"src/AddResultCommand.h"
"src/Bet.h"
"src/BettorResults.cpp"
"src/BettorResults.h"
"src/CommandBase.h"
"src/ICommandReceiver.cpp"
"src/ICommandReceiver.h"
"src/BotData.cpp"
"src/BotData.h"
"src/Match.cpp"
"src/Match.h"
"src/MatchScore.cpp"
"src/MatchScore.h"
"src/ShowBettorsResultsCommand.cpp"
"src/ShowBettorsResultsCommand.h"
"src/ShowIncomingMatchesCommand.cpp"
"src/ShowIncomingMatchesCommand.h"
"src/JsonSerializer.cpp"
"src/JsonSerializer.h"
"src/SaveManager.cpp"
"src/SaveManager.h"
"src/BetBot.cpp"
"src/BetBot.h"
"src/DrawUtils.cpp"
"src/DrawUtils.h"
"src/ShowBetProposalCommand.cpp"
"src/ShowBetProposalCommand.h"
"src/ChooseMatchToBetOnCommand.cpp"
"src/ChooseMatchToBetOnCommand.h"
"src/ChooseMatchToSetResultCommand.cpp"
"src/ChooseMatchToSetResultCommand.h"
"src/ShowResultProposalCommand.cpp"
"src/ShowResultProposalCommand.h"
"src/FileWatcher.cpp"
"src/FileWatcher.h"
"src/LockableDataAccessors.h"
"src/BotConfigReader.cpp"
"src/BotConfigReader.h"
)
# Find our pre-installed DPP package (using FindDPP.cmake).
find_package(DPP REQUIRED)
# Link the pre-installed DPP package.
target_link_libraries(${PROJECT_NAME}
${DPP_LIBRARIES}
)
# Include the DPP directories.
target_include_directories(${PROJECT_NAME} PRIVATE
${DPP_INCLUDE_DIR}
)
set_target_properties(${PROJECT_NAME} PROPERTIES
CXX_STANDARD 20
CXX_STANDARD_REQUIRED ON
)
# Google Test
include(FetchContent)
FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
# Test executable
enable_testing()
add_executable(Tests
"tests/MatchScore_Tests.cc"
)
target_link_libraries(Tests GTest::gtest_main)
target_compile_definitions(Tests PRIVATE TEST_ENABLED=1)
# Copy config.json at the right place
add_custom_command(
TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_SOURCE_DIR}/config.json
${CMAKE_CURRENT_BINARY_DIR}/config.json
)
Код: Выделить всё
#include
#include "../src/MatchScore.h"
TEST(MatchScoreTest, ComparePerfectTeamA)
{
MatchScore A{ 3,0 };
MatchScore B{ 3,0 };
EXPECT_EQ(A.Compare(B), MatchScore::EComparingResult::Perfect);
}
Проблема
Когда я пытался скомпилировать, у меня возникла эта ошибка ссылки:
ошибка LNK2019: неразрешенный внешний символ "public: enum MatchScore::EComparingResult __cdecl MatchScore ::Compare(struct MatchScore const &)const " (?Compare@MatchScore@@QEBA?AW4EComparingResult@1@AEBU1@@Z), указанный в функции "private: virtual void __cdecl MatchScoreTest_ComparePerfectTeamA_Test::TestBody(void)" (?TestBody@) MatchScoreTest_ComparePerfectTeamA_Test@@EEAAXXZ)
Из моего базового понимания CMake мне это кажется нормальным, поскольку я не добавлял файл MatchScore.cpp в исходный код исполняемого файла Tests. Но мне также кажется странным, что мне приходится снова добавлять все свои исходники в исполняемый файл Tests.
Поэтому у меня есть два вопроса:
- Является ли подход с двумя исполняемыми файлами правильным?
- Если да, нужно ли мне включать весь исходный файл в исполняемый файл Tests или есть лучший способ сделать это? это ?
Подробнее здесь: https://stackoverflow.com/questions/791 ... -and-cmake