Я пытаюсь создать решение моего проекта Unreal Engine 5, которое состоит из нескольких модулей кода, два из которых — CelBody
и OrbitSuite
. Эти модули имеют структуру, рекомендованную Epic Games (с личными и общедоступными папками, содержащими файлы .cpp и .h соответственно). OrbitSuite
является частной зависимостью CelBody
, поскольку он содержит структуру данных под названием FBodyData
, которая является типом одного из атрибутов члена класса актера ACelBody
.
Папки модулей OrbitSuite и CelBody находятся в одном исходном каталоге моего проекта Unreal, #includes написаны правильно, а IntelliSense не показывает никаких проблем, связанных с отсутствующими заголовками или неразрешенными элементами. В CelBody.Build.cs OrbitSuite включен в список строк PrivateDependencyModuleNames, который не редактируется с момента последней успешной компиляции проекта.
Когда я пытаюсь скомпилировать, ошибка LNK2019 гласит:
LNK2019: unresolved external symbol "public: __cdecl FBodyData::FBodyData(void)" (??0FBodyData@@QEAA@XZ) referenced in function "public: __cdecl ACelBody::ACelBody(class FVTableHelper &)" (??0ACelBody@@QEAA@AEAVFVTableHelper@@@Z)
При поиске кода ошибки он, очевидно, сигнализирует о том, что «когда объявление существует в заголовочном файле, но не реализовано соответствующее определение» и в данном случае относится к конструктору по умолчанию FBodyData
, который вызывается объявлением члена FBodyData BodyData
в определении класса ACelBody
. Я четырежды проверил BodyData.h и BodyData.cpp, и конструктор по умолчанию определен и реализован правильно.
Я ожидаю, что у компилятора не возникнет проблем с поиском реализации FBodyData()
, и опасаюсь, что ошибка может быть вызвана чем-то посторонним. Дайте мне знать, если есть журналы, которые было бы полезно предоставить, или если требуется дополнительная информация о структуре файла или реализации класса.
Для этой ошибки нет другой причины, кроме как «когда объявление существует в файле заголовка, но соответствующее определение не реализовано». Вам нужно быть более настойчивым в выяснении, почему это происходит. Ошибка, скорее всего, связана с вашими методами сборки, возможно, из-за того, что файл, содержащий определение, не компилируется или не связывается с остальной частью вашего кода.
Поскольку вы не предоставили никакого кода, я могу только догадываться, но вы, вероятно, забыли экспортировать свои классы, чтобы использовать их в другом модуле.
// <ModuleName>_API is defined as platform-specific DLL export/import
// directives by UBT.
class CELBODY_API FBodyData
{
FBodyData() = default;
};
Огромное спасибо, вот и все. По какой-то причине я думал, что <ModuleName>_API необходим только для UCLASS (OrbitSuite состоит из всех USTRUCT и UENUM). Рад узнать, что означает эта строка, и извините всех, что не предоставили достаточно информации.
Этот вопрос похож на: Что такое неопределенная ссылка/неразрешенная ошибка внешнего символа и как ее исправить?. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.