Я разработчик библиотеки 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
) показывает, что все символы все еще там …
Вы можете использовать идиома скрыть внутреннюю реализацию библиотеки классов 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();
}
Других решений пока нет …