dllexport — экспорт символов c ++

Я разработчик библиотеки c ++ для Linux, Windows и osX. Поскольку osX теперь не обрабатывает должным образом анонимные исключения, я подумал о том, чтобы четко обозначить символы, которые необходимо экспортировать. Следующий эти объяснения Я определил два макроса: FOO_API а также FOO_LOCAL для маркировки символов. Теперь у меня есть следующие проблемы:

Я определяю каждый класс в своем собственном файле (потому что я не хочу файлы длиной более 1000). Если класс A используется только в моей библиотеке, имеет смысл пометить его FOO_LOCAL, Но если класс B имеет закрытый член типа Aи класс B является FOO_API, затем я получаю предупреждение компилятора, и связывание не выполняется (символ не найден). Похоже, что это бросает вызов всему смыслу этих атрибутов экспорта. Итак, что это должно быть? Я отмечаю свой класс чем-то вроде class FOO_LOCAL A {...} Это правильно?

Разве не существует способа, чтобы все частные члены были локальными? (поскольку они являются частными, к ним нельзя обращаться напрямую). Это сделает процесс маркировки менее утомительным …

Наконец, когда я отмечаю, например, мои классы исключений, он компилируется и работает правильно, но показывает символы (nm -C -D my_lib.so) показывает, что все символы все еще там …

0

Решение

Вы можете использовать идиома скрыть внутреннюю реализацию библиотеки классов API от общественности (и, следовательно, при связывании библиотеки).

S.th. лайк:

B.hpp:

class BImpl;

class FOO_API B
{
public:
// Public stuff
B();
~B();

void foo();
private:
BImpl* bimpl;
};

B.cpp:

#include "B.hpp"#include "A.hpp"
struct BImpl
{
void foo()
{
// Do something with 'a'
}

A a;
};

B::B()
: bimpl(new BImpl())
{
}

B::~B()
{
delete bimpl;
}

void B::foo()
{
bimpl->foo();
}
1

Другие решения

Других решений пока нет …