Как разделить приложение C++Builder на библиотеки DLL


Мне несколько раз говорили, что я должен рассмотреть возможность разделения частей моего приложения на отдельные библиотеки DLL (для ускорения связывания и т. д.) и пытаюсь понять, как это работает.

Я понимаю, что мне нужно добавить __declspec(dllexport) в каждое объявление файла заголовка, которое я планирую использовать. Это кажется утомительным, но вполне выполнимым.

Как запустить приложение + DLL? В простом тестовом проекте единственный способ, который я нашел, что работает, - это вручную скопировать DLL из выходных данных сборки проекта DLL каталог в выходной каталог сборки exe-проекта. Я знаю, что могу настроить шаг после сборки, чтобы сделать это, но я ожидаю, что IDE будет иметь какой-то способ автоматизировать использование проекта приложения в проекте DLL, когда они являются частью одной группы проектов.

Как отладить приложение + DLL? Я вижу, где я могу указать хост-приложение для библиотеки DLL в разделе Project - > Options - > Debugger, но до сих пор я мог только выяснить, как отлаживать один проект за один раз. Я бы очень хотел иметь возможность установить точки останова в любом месте кодовой базы и одношаговый переход в любом месте кодовой базы (вместо того, чтобы останавливаться на границах проекта), и я не могу понять, как это сделать.

1 3

1 ответ:

Я понимаю, что мне нужно добавить _ _ declspec (dllexport) в каждый заголовок декларация файла, которую я планирую использовать. Это кажется утомительным, но это так. выполнимый.

Что вам следует сделать, так это создать #define в заголовочном файле вашей библиотеки DLL, который сопоставляется с dllexport, когда заголовок компилируется проектом DLL, и сопоставляется с dllimport при компиляции в других проектах. Например:

#ifndef MyDLLH
#define MyDLLH

#ifdef _BUILDING_DLL_
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif

MY_EXPORT type callingconvention SomeFunc(parameters);
#ifdef __cplusplus
}
#endif

#endif

Тогда вы можете определить _BUILDING_DLL_ только в вашем проекте DLL, либо в списке Conditionals параметров проекта или в коде выше любых операторов #include для файла заголовка, например:

#define _BUILDING_DLL_
#include "MyDll.h"

Как запустить приложение + DLL?

Проект DLL генерирует a .lib-файл, используемый для статического связывания с экспортируемыми функциями библиотеки DLL. Вы можете добавить это .lib-файл в ваш EXE-проект, а затем вызовите функции DLL, как и любой другой вызов функции. Или вы можете динамически загружать функции DLL во время выполнения с помощью Win32 API LoadLibrary () и GetProcAddress() функции, в этом случае вы не используете .файл lib вообще.

В простом тестовом проекте я обнаружил, что единственный способ, который работает, - это вручную скопировать dll файлы из директории сборки проекта DLL в выходной каталог сборки exe-проекта.

Папка EXE-это первое место, где ОС ищет DLL, но это не единственное место, где ОС может искать. MSDN документирует, как DLL расположены во время выполнения:

Поиск По Динамическим Ссылкам В Библиотеке Порядок

Я знаю, что могу настроить шаг после сборки, чтобы сделать это, но я ожидаю, что IDE, чтобы иметь какой-то способ автоматизировать наличие проекта приложения использовать DLL проект, когда они являются частью одной проектной группы.

Просто быть частью одной и той же проектной группы недостаточно. Проекты составляются независимо друг от друга. Тем не менее, вы можете установить проект DLL как зависимость от проекта EXE (или просто убедитесь, что DLL projct находится выше по порядку сборки, то EXE-проект), так что DLL компилируется сначала, а затем использовать события DLL PostBuild для перемещения скомпилированной .Либ И.DLL двоичные файлы, где это необходимо, и, наконец, добавить DLL компилируется .lib-файл в EXE-проект, поэтому DLL используется во время выполнения.

Как отладить приложение + DLL?

У вас есть несколько вариантов:

Чтобы отладить только саму DLL, загрузите проект DLL в IDE, перейдите в Параметры запуска и установите скомпилированный EXE в главном приложении. Вы можете затем запустите проект DLL, как если бы это был проект EXE. Исполняемый файл будет выполнен, и отладчик присоединится к DLL, как только он будет загружен в память.

Чтобы отладить оба проекта одновременно, загрузите вместо этого EXE-проект в IDE и убедитесь, что исходная папка DLL указана в пути Debug Souce параметров проекта. Затем вы можете нормально запустить проект EXE, войти в функции DLL, когда они вызываются, установить точки останова в исходном файле DLL и т. д.