Я просто читал «Creating Library with backward compatible ABI that uses Boost». Теперь у меня есть класс, который должен быть сериализован с использованием boost. Как я могу скрыть эту часть из открытого интерфейса? В упомянутой статье было предложено использовать скрытую опцию -fvisibility gcc. Я пытался реализовать это в тестовом классе:Скрыть boost :: сериализация в общедоступном интерфейсе общей библиотеки
#define LOCAL __attribute__ ((visibility ("hidden")))
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/shared_ptr.hpp>
class hideBoost
{
public:
int visible;
LOCAL boost::shared_ptr<int> notVisible;
private:
friend class boost::serialization::access;
template<class archive>
void serialize(archive& ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP(visible);
ar & BOOST_SERIALIZATION_NVP(notVisible);
}
};
И моя главная программа:
#include <iostream>
#include "HideBoost.hpp"
int main()
{
std::cout<<"start"<<std::endl;
hideBoost b;
b.visible=5;
b.notVisible=10;
std::cout<<"end"<<std::endl;
}
Оба компилируются с помощью GCC-4.6 на MacOSX с флагом -fvisibility=hidden
. EDIT: основной программе не нужно повышать заголовки во время компиляции, поэтому компиляция не выполняется. Я не хочу передавать заголовки заголовков в основную программу, так как это может привести к несовместимости систем, в которых установлено более одной версии boost (я предполагаю, что это называется несовместимостью ABI).
Теперь мой вопрос:
1) Является ли переменная notVisible
член в моем примере правильно скрыт от общего интерфейса?
2) EDIT: Как скрыть процедуру сериализации и файлы заголовков?
Я благодарен за любые подсказки, как это можно сделать правильно. Решение, которое работает с gcc и clang на unix и OS X, было бы замечательно. Заранее спасибо!
С наилучшими пожеланиями, Питер
Как сказал HIF, видимость не является правильным инструментом. Но чего вы пытаетесь достичь? «Как я могу скрыть эту часть из открытого интерфейса?»: Какой интерфейс? Файл заголовка? – YSC
Я обновил свое оригинальное сообщение. Основная цель - избежать проблем с системами, в которых установлены несколько версий boost. – hansgans