поэтому у меня есть DLL, которая обращается к некоторым классам за пределами своего проекта (я использую Visual Studio, поэтому у меня есть два проекта.). Дело в том, что в заголовке, который включает dll, который находится вне проекта dll, есть только тела функций, например:
x.h
class x
{
void myFunc();
}
И в другом файле cpp, вне файла dll:
#include "x.h"
x::myFunc()
{
//.....
}
Дело в том, что dll получает только тела функций, поэтому, когда я компилирую, я получаю множество неразрешенных внешних символов (я совершенно уверен, что это проблема, потому что я тестировал другой класс, полностью встроенный в .h файл, в другом проекте и без ошибок). Так как же решить эту загадку?
Благодарю вас
PS. Извините, если мой английский не идеален, так как я не являюсь носителем английского языка.
Обычно заголовки импорта имеют только сигнатуры функций; фактические тела функций уже скомпилированы в двоичный файл DLL и разрешаются во время компоновки путем ссылки на фактическую DLL.
Первое, что нужно попробовать, это убедиться, что вы действительно ссылаетесь на указанную DLL. Недостаточно просто включить заголовок, вам также нужно указать ссылку на двоичный файл. Поэтому в конфигурации вашего проекта вам нужно добавить ссылку (например) на файл .lib, который создается вместе с DLL при компиляции DLL (если в MSVC). Этот файл lib позволяет компоновщику узнать, как связать сигнатуры функций, которые вы включили через заголовок импорта, с фактическими реализациями, содержащимися в DLL. Если вы находитесь на другой платформе, механика может немного отличаться, но концепции будут похожи.
Редактирование:
Следующий шаг — убедиться, что двоичный файл действительно экспортирует символы, с которыми вы пытаетесь связать. Убедитесь, что все подписи интерфейса экспортируются через префиксы __declspec (dll_export). Обычно это заключено в IFDEF, так что заголовок объявляется экспортным во время компиляции DLL, но не тогда, когда этот заголовок включен в клиентский проект. Затем вы можете использовать dumpbin, чтобы проверить искаженные имена экспорта и посмотреть, есть ли что-нибудь неожиданное.
Вот модифицированная версия вашего примера, которая иллюстрирует этот стиль экспорта (обратите внимание, я не проверял, компилируется ли он, приносим извинения за любые опечатки):
#ifdef BUILDING_MYDLL
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
class MYDLL_API x
{
void myFunc();
}
Затем вы должны настроить свою конфигурацию на определение BUILDING_MYDLL при компиляции dll, но не при компиляции исполняемого файла. Таким образом функции помечаются как экспортные только при компиляции библиотеки dll. Теперь вы можете пометить ваши общедоступные функции API с помощью MYDLL_API, и они должны быть экспортированы во время сборки.
Обратите внимание, что dll_export, dll_import и declspec — все это очень специфичные для MSVC конструкции. Другие компиляторы / среды выполнения обрабатывают экспорт символов по-разному.
Есть несколько способов связать DLL с вашим приложением в Windows, посмотрите этот существующий вопрос / ответ:
https://stackoverflow.com/a/2060508/1701823