как разделить класс между проектами c ++?

0

Мое решение VS2012 содержит несколько проектов VC++. У меня также есть много общих файлов, которые нужно разделить. Легко обмениваться перечислениями и структурами. Я просто "включаю" соответствующий файл заголовка и его. Мне даже не нужно компилировать проект "commons"!

Но что, если мне нужно разделить более сложные классы, содержащие файлы.h и.cpp, и поэтому их необходимо скомпилировать?

И самый сложный вопрос - могу ли я поделиться потокобезопасным синглтоном? Я хочу получить к нему доступ из разных проектов из разных потоков (но из одного процесса).

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

Я бы предпочел что-то портативное, так как позже я переведу все решение для Linux.

  • 1
    Как насчет библиотеки?
Теги:
visual-c++

1 ответ

2
Лучший ответ

Проекты, содержащие классы, которые вы хотите разделить, должны экспортировать свои символы. Когда вы создаете проект DLL в Visual Studio, вы можете дать ему возможность "Экспорт" символов, и он предоставляет некоторый код котельной плиты для вас.

По сути, в файле заголовков ваших библиотек он даст вам:

// myapi.h

#if defined(MYAPIEXPORTS)
    #define MYAPI __declspec(dllexport)
#else
    #define MYAPI __declspec(dllimport)
#endif

"MYAPIEXPORTS" предоставляется мастером, но это директива препроцессора компилятора ТОЛЬКО на самой библиотеке. Следовательно, когда вы компилируете библиотеку, MYAPI предназначен для экспорта и когда заголовочный файл включен в ваши другие проекты, он будет импортироваться.

Теперь давайте посмотрим на класс, который вы хотите разделить.

// myclass.h

class MYAPI MyClass
{
public:
    MyClass();
    ~MyClass();
};


// myclass.cpp
#include "myClass.h"

MyClass::MyClass() { /* ... */ };
MyClass::~MyClass() { /* .... */ }

Затем вашим другим проектам необходимо связать с полученным.lib файлом, который сгенерирован.

Обратите внимание: если у вас есть template<> содержащийся полностью в файле заголовка, вы его не экспортируете. Это будет вести себя как ваши перечисления и typedefs.

Чтобы ответить на вторую часть вашего вопроса, да, один синглтон, определенный в вашей библиотеке, также будет доступен для основного проекта.

  • 0
    спасибо, я использовал этот учебник, и он отлично. msdn.microsoft.com/en-us/library/ms235627(v=vs.110).aspx
  • 0
    @javapowered, рад, что ты нашел это. Обратите внимание, что учебник, на который вы ссылаетесь, предназначен только для статических функций, а не для экспорта классов, для которых вы можете создавать экземпляры.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню