Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Developing a game engine
0 / 0 / 0
Регистрация: 25.04.2017
Сообщений: 87
1

unresolved external symbol из-за того, что в lib файле, который использует exe, не определён сторонний класс

27.07.2020, 17:18. Показов 1058. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прежде всего, весь код в архиве. А тут лишь краткое описание происходящего.

DLL:
- определён класс CFileSystem
- собирается без ошибок

LIB:
- определён класс VGUI
- используются методы CFileSystem
- собирается без ошибок

EXE:
- линкуется LIB
- получается поинтер на переменную типа CFileSystem и передаётся в новую переменную типа VGUI
- при сборке жалуется на неразрешённые внешние символы: методы класса CFileSystem, в том числе конструктор. Ну это понятно. Причём ошибка как в obj-файле EXE, так и в obj-файле LIB

Можно ли что-то предпринять в данной ситуации? В LIB CFileSystem необходим, но при этом он не должен быть определён там: ему там просто не место.

PS. Решение называется так, как называется, потому что изначально я предпринимал попытки экспорта классов из DLL в EXE. Поняв, что ничего у меня без фабричного метода не выйдет (а его реализовывать я не хочу), остановился на использовании статичной библиотеки
Вложения
Тип файла: zip ClassExport.zip (10.7 Кб, 6 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2020, 17:18
Ответы с готовыми решениями:

LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
В нескольких словах, ошибка: LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol...

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Помогите разобрать в ошибке. LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol...

nafxcwd.lib(thrdcore.obj) : error LNK2019: unresolved external symbol __endthreadex referenced in function
Помогите. Что надо сделать???

Unresolved external symbol, unresolved token
Всем привет. У меня тут такое дело: // learncpp.cpp : main project file. #include "stdafx.h"...

4
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,068
27.07.2020, 22:02 2
Если ваш LIB должен линковаться именно в EXE (как вы говорите), и вы хотите напрямую работать с методами CFileSystem в EXE (как у вас сейчас), то тогда весь класс CFileSystem должен быть объявлен как dllexport при компиляции DLL и dllimport при компиляции всего остального. У вас этого не сделано. Неудивительно, что за пределами DLL этот класс не линкуется. Он просто не экспортируется из DLL вообще.

Другое дело, если бы LIB линковался только в DLL...

---

Для чего предназначен интерфейс IFileSystem? Он выглядит так, как будто именно через него должны были решаться вопросы связывания (как это делается в COM, вместо вашей нынешней прямой линковки). Но вы через него вообще нигде даже и не пытаетесь работать. Зачем вы тогда вообще заводили IFileSystem?
0
Developing a game engine
0 / 0 / 0
Регистрация: 25.04.2017
Сообщений: 87
28.07.2020, 04:48  [ТС] 3
IFileSystem нужен в конечном проекте для того, чтобы как раз не возникало ошибок с внешними символами. IFileSystem, в свою очередь, имеет базовым классом IBase и складируется в vector<IBase*>interfaces вместе с остальными интерфейсами. Доступ к интерфейсу из другого модуля осуществляется через экспортную функцию. Кину код уж для наглядности.

C++
1
2
3
4
5
6
7
8
9
10
__declspec(dllexport) IBase* GetInterface(string name) {
        for (InterfaceInfo_t* i : interfaces)
            if (i->name._Equal(name)))
                return i->pointer;
 
        if (gLog != nullptr)
            gLog->warning("Interface named \"%s\" isn't found in \"%s\" module", name.c_str(), GetModuleName().c_str());
        else
            ErrorMsgBox("Interface named \"%s\" isn't found in \"%s\" module", name.c_str(), GetModuleName().c_str());
    }
В конечном проекте по итогу будет тоже самое как и в ClassExport, только вместо EXE-шника, LIB-а будет линковаться к другим DLL, где используется GUI. Но в LIB-е же необходимо работать с CFileSystem из filesystem.dll, с CLogиз в engine.dll, и ещё с парой классов.

По поводу dllexport и dllimport: с ними ситуация не меняется и даже становится хуже. Прикрепил скриншоты: 1) мои родные ошибки; 2) ошибки при использовании dllexport/dllimport

Речь ведь только об этом?
C++
1
2
class __declspec(dllexport) CFileSystem {... //DLL
class __declspec(dllimport) CFileSystem {... //LIB, EXE
Миниатюры
unresolved external symbol из-за того, что в lib файле, который использует exe, не определён сторонний класс   unresolved external symbol из-за того, что в lib файле, который использует exe, не определён сторонний класс  
0
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,068
28.07.2020, 05:57 4
Лучший ответ Сообщение было отмечено Jodi Redlot как решение

Решение

Цитата Сообщение от Jodi Redlot Посмотреть сообщение
IFileSystem нужен в конечном проекте для того, чтобы как раз не возникало ошибок с внешними символами.
Это прекрасно, но пока что в вашем коде он не используется "чтобы как раз не возникало ошибок с внешними символами". Ваш код напрямую работает с CFileSystem. А IFileSystem в этом никак не участвует.

Цитата Сообщение от Jodi Redlot Посмотреть сообщение
Речь ведь только об этом?
C++
1
2
class __declspec(dllexport) CFileSystem {... //DLL
class __declspec(dllimport) CFileSystem {... //LIB, EXE
Да, именно. Но что именно у вас там теперь понаписано из этого огрызка не ясно.

---

Я чисто ради эксперимента переобъявил ваш класс как

C++
1
2
3
4
5
6
7
8
class 
#ifdef EXPORTDLL_EXPORTS
  __declspec(dllexport)
#else
  __declspec(dllimport)
#endif
CFileSystem : public IFileSystem {
  ...
и у меня все прекрасно слинковалось.

---

Уточнение: для этого мне еще понадобилось подключить библиотеку импорта DLL. Где у вас в коде это подключение? У вас есть

C++
1
#pragma comment(lib, "ExportLIB.lib")
А для ExportDLL.lib где у вас аналогичное подключение???

(И что за странная манера использовать #pragma comment? В Visual Studio у вас в проектах есть References именно для того, чтобы не заниматься подобной фигней.)
1
Developing a game engine
0 / 0 / 0
Регистрация: 25.04.2017
Сообщений: 87
28.07.2020, 06:14  [ТС] 5
После подключения ExportDLL.lib всё слинковалось и заработало как надо. Спасибо вам большое.

А либу я приконтачил через #pragma comment чисто для наглядности. В конечном проекте я, конечно, таким не балуюсь.
0
28.07.2020, 06:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2020, 06:14
Помогаю со студенческими работами здесь

Что такое "unresolved external symbol _WSACleanup@0"?
Здравствуйте, есть проект на VC6, использующий Winsock с таким кодом: #include 'winsock.h' ...

Unresolved external symbol
Чем больше я сталкиваюсь с этой ошибкой и чем больше решаю её, тем непонятнее она становится....

Unresolved external symbol
Начал учить API, немогу запустить программу выдает ошибку 1 unresolved external symbol #include...

Unresolved external symbol
Читаю книгу по программированию в MFC, хоть она и 13летней давности В общем дошол до создания окна...

unresolved external symbol
В одном hpp файле описано N кол-во классов (для примера достаточно двух): namespace heart {...

unresolved external symbol
Доброе время собственно не понимаю почему компилатор ругается. Файлы : main.cpp #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru