Как разбить приложение C ++ Builder на библиотеки DLL - PullRequest
3 голосов
/ 10 февраля 2012

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

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

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

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

1 Ответ

3 голосов
/ 10 февраля 2012

Я понимаю, что мне нужно добавить __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, либо в списке Условий в параметрах проекта, либо в своем коде над любыми операторами #include для файла заголовка, например:

#define _BUILDING_DLL_
#include "MyDll.h"

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

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

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

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

Порядок поиска в динамических библиотеках

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

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

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

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

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

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

...