Несколько ошибок LNK2019 и LNK2001 «неразрешенный внешний символ» при компиляции модульного исходного кода UE5 C++

Я пытаюсь создать решение моего проекта 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(), и опасаюсь, что ошибка может быть вызвана чем-то посторонним. Дайте мне знать, если есть журналы, которые было бы полезно предоставить, или если требуется дополнительная информация о структуре файла или реализации класса.

Этот вопрос похож на: Что такое неопределенная ссылка/неразрешенная ошибка внешнего символа и как ее исправить?. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

Ken White 10.08.2024 05:17

Для этой ошибки нет другой причины, кроме как «когда объявление существует в файле заголовка, но соответствующее определение не реализовано». Вам нужно быть более настойчивым в выяснении, почему это происходит. Ошибка, скорее всего, связана с вашими методами сборки, возможно, из-за того, что файл, содержащий определение, не компилируется или не связывается с остальной частью вашего кода.

john 10.08.2024 06:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы не предоставили никакого кода, я могу только догадываться, но вы, вероятно, забыли экспортировать свои классы, чтобы использовать их в другом модуле.

// <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). Рад узнать, что означает эта строка, и извините всех, что не предоставили достаточно информации.

Liam Dwyer 11.08.2024 02:17

Другие вопросы по теме