Неопределенные символы для архитектуры x86_64 при написании модульных тестов с gtest и clang 12

#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 . Я также пробовал с just common , он не выдает эту ошибку, но и не решает исходную проблему. Я не очень уверен в 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 .