0

Я не так разбираюсь в создании DLL в MSVC++ 2010, просто может быть несколько раз в рамках кривой обучения. На данный момент у меня есть очень большой файл с примерно 10 различными классами. Мне приходится разбивать файл на несколько файлов и перемещать связанные классы в один и тот же файл. Поэтому, прежде чем продолжить, я хотел бы узнать от опытных разработчиков о моей ситуации.Ловушки для разбивки большого файла на одну DLL?

Что-то вроде следующего

// Header 
namespace collections 
{ 
classA 
classB 
ClassC 
ClassD : ClassA,ClassB 
} 
// CPP 
namespace collections 
{ 
classA 
    { 
     // Implementations 
    } 
// Rest of the classes 
} 

После разбивки на отдельные файлы

// ClassA.h 
namespace Collections 
{ 
    ClassA 
} 

// ClassB.h 
namespace Collections 
{ 
    ClassB 
} 

// Implentations etc 

Мой основной проблемой является использование dllexport/DllImport класса хранения атрибутов Поскольку файл будет разбит I необходимо будет использовать следующее:

#ifdef MAKEDLL 
# define EXPORT __declspec(dllexport) 
#else 
# define EXPORT __declspec(dllimport) 
#endif 

против классов для их экспорта/импорта. Но размещение этой строки в каждом заголовочном файле, который будет создан (с одним пространством имен «Коллекции»), будет ли это иметь какие-либо плохие последствия при компиляции или создании кода? Я смотрел вокруг он-лайн и узнал, что люди больше всего жалуются на ошибки компоновщика/предупреждения, когда определенный член переопределяется или не найден во время создания DLL. Это, безусловно, должна быть решена проблема только, что я не знаю, что является лучшим и правильным способом сделать это. Мне нужно создать только одну DLL в конце. Мне не нужно создавать несколько DLL.

Любые рекомендации или помощь очень ценятся. Спасибо

+0

Прежде всего, вы не должны dll разделять классы, которые разделяют логический контекст (отвечают за что-то одно и то же). Если ваши классы хорошо написаны, а не в одном файле (я читал эти строки, что у вас есть все классы в ОДНОМ исходном файле?), Это не должно быть проблемой.IMHO, разделяющий их в разных dll, имеет смысл только в том случае, если вы хотите доставить свою программу с различными функциями (плагинами), но если ваша программа всегда требует, чтобы все DLL работали, вы можете просто позволить им быть такими, какие они есть сейчас. – Najzero

+0

Ваш вопрос неясно, хотите ли вы разбить одну DLL на несколько или один файл H/CC на несколько, сохраняя их в одной DLL. –

+0

@Najzero Файл получает большой беспорядок. Так что я должен сломать его –

ответ

2

Там нет вопроса, чтобы иметь один общий файл заголовка, который определяет EXPORTS макрос:

mydll.h

#ifdef MYDLL_EXPORTS 
#define MYDLL_API __declspec(dllexport) 
#else 
#define MYDLL_API __declspec(dllimport) 
#endif 

И этот файл заголовка, включенных в другие файлы заголовков:

ClassA.h

#include "mydll.h" 
namespace Collections 
{ 
    class MYDLL_API ClassA { 
    // ... 
    } 
} 

ClassA.cpp

#include "ClassA.h" 
// ... 

ClassB.h

#include "mydll.h" 
namespace Collections 
{ 
    class MYDLL_API ClassB { 
    // ... 
    } 
} 

... и так далее. Вы можете иметь все из них (файлы заголовков и файлы реализации .cpp) в одной DLL, имеющей MYDLL_EXPORTS, определенный в настройках вашего проекта DLL (это делается автоматически мастером VS2010 DLL).

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

+0

@Mathieu Итак, я сохраняю макросы EXPORT в одном общем файле заголовка, а затем использую их в остальных файлах заголовков. Несмотря на все это, будут ли какие-либо проблемы последовательность, в которой я разделяю файлы и включаю их? Как и Class1, объект класса class2 –

+0

@Mathieu Я проверю это и посмотрю, смогу ли я выбрать ваш ответ! –

+0

Нет, тот факт, что файлы находятся в DLL, ничего не меняет по сравнению с тем, что находится в программе. Если у ваших классов есть некоторые зависимости между ними, скажем, 'ClassB' требует' ClassA', тогда вы должны '#include" ClassA.h "' в 'ClassB.h'. Если у вас есть циклические зависимости, используйте форвардное объявление, как обычно (и как вам нужно, если все ваши объявления находятся в одном файле). –

 Смежные вопросы

  • Нет связанных вопросов^_^