Мое решение VS2012 содержит несколько проектов VC++. У меня также есть много общих файлов, которые нужно разделить. Легко обмениваться перечислениями и структурами. Я просто "включаю" соответствующий файл заголовка и его. Мне даже не нужно компилировать проект "commons"!
Но что, если мне нужно разделить более сложные классы, содержащие файлы.h и.cpp, и поэтому их необходимо скомпилировать?
И самый сложный вопрос - могу ли я поделиться потокобезопасным синглтоном? Я хочу получить к нему доступ из разных проектов из разных потоков (но из одного процесса).
Думаю, я должен использовать что-то вроде статической или динамической компоновки, но я не уверен. Возможно, кто-то может связать пошаговое руководство для решения такой проблемы?
Я бы предпочел что-то портативное, так как позже я переведу все решение для Linux.
Проекты, содержащие классы, которые вы хотите разделить, должны экспортировать свои символы. Когда вы создаете проект 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.
Чтобы ответить на вторую часть вашего вопроса, да, один синглтон, определенный в вашей библиотеке, также будет доступен для основного проекта.