#c #cmake #clang #googletest #azerothcore
#c #cmake #clang #googletest #azerothcore
Вопрос:
Я пытаюсь добавить модульные тесты для некоторых функций, определенных в этом файле:
Мой тестовый файл выглядит следующим образом:
#include "gtest/gtest.h"
#include "Formulas.h"
#include "SharedDefines.h"
using namespace acore::Honor;
using namespace acore::XP;
TEST(FormulasTest, hk_honor_at_level)
{
EXPECT_EQ(hk_honor_at_level(80), 124);
// some more checks here...
}
TEST(FormulasTest, GetGrayLevel)
{
EXPECT_EQ(GetGrayLevel(0), 0);
// some more checks here...
}
TEST(FormulasTest, GetColorCode)
{
EXPECT_EQ(GetColorCode(60, 80), XP_RED);
// some more checks here...
}
TEST(FormulasTest, GetZeroDifference)
{
EXPECT_EQ(GetZeroDifference(1), 5);
// some more checks here...
}
TEST(FormulasTest, BaseGain)
{
// PROBLEM HERE
EXPECT_EQ(BaseGain(60, 1, CONTENT_1_60), 0);
}
проблема возникает, как только я вызываю функцию BaseGain
, определенную внутри Formulas.h:
Undefined symbols for architecture x86_64:
"_LoginDatabase", referenced from:
Log::outDB(LogTypes, char const*) in libcommon.a(Log.cpp.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [src/test/unit_tests] Error 1
make[2]: *** [src/test/CMakeFiles/unit_tests.dir/all] Error 2
make[1]: *** [src/test/CMakeFiles/unit_tests.dir/rule] Error 2
make: *** [unit_tests] Error 2
В частности, проблема исчезнет, если я удалю вызов sLog->outError
:
sLog->outError("BaseGain: Unsupported content level %u", content);
От BaseGain
.
Однако эта проблема возникает только в модульных тестах, остальной исходный код проекта компилируется просто отлично.
Чтобы скомпилировать проект, включающий модульные тесты, передайте -DBUILD_TESTING=1
параметр cmake
команде.
РЕДАКТИРОВАТЬ: я уже пытался добавить common
в target_link_libraries
оф src/test/CMakeLists.txt
, но это не решило проблему для меня.
Комментарии:
1. Как обычно с
Undefined symbols
ошибками, для исправления ошибки вам нужно связать с соответствующей библиотекой или добавить соответствующий исходный файл. В вашем случае вам нужно найти библиотеку или файл, который определяет символ_LoginDatabase
.2. Эта проблема связана с тем, что ваши модульные тесты не связаны с библиотекой ведения журнала (т. Е. Библиотекой, Которая определяет
Log
класс). В идеале ваша система сборки должна знать, что если ваши тесты зависят отlibcommon
, они должны быть связаны с библиотекой ведения журнала.3. @NicholasM к сожалению, если я добавлю
llibcommon
кtarget_link_libraries
тестам ‘ CMakeLists.txt Я понимаюld: library not found for -llibcommon
. Я также пробовал с justcommon
, он не выдает эту ошибку, но и не решает исходную проблему. Я не очень уверен в CMake, не могли бы вы дать мне подсказку?4. Вы должны попытаться использовать точное целевое имя CMake вашей библиотеки. Например, если в вашем файле cmake есть
add_library(my_common_lib, ...)
, иadd_executable(my_tests, ...)
, вы должны использоватьtarget_link_libraries(my_tests PRIVATE my_common_lib)
. Возможно, вам потребуется опубликовать свои данные CMake в отдельном вопросе.
Ответ №1:
Вы можете решить, добавив:
LoginDatabaseWorkerPool LoginDatabase;
для вашего FormulaTest.cpp
.