2016-12-05 8 views
1

Я просто читал «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, было бы замечательно. Заранее спасибо!

С наилучшими пожеланиями, Питер

+0

Как сказал HIF, видимость не является правильным инструментом. Но чего вы пытаетесь достичь? «Как я могу скрыть эту часть из открытого интерфейса?»: Какой интерфейс? Файл заголовка? – YSC

+0

Я обновил свое оригинальное сообщение. Основная цель - избежать проблем с системами, в которых установлены несколько версий boost. – hansgans

ответ

1

__attribute__ ((visibility ("hidden"))) не имеет ничего общего с вашей проблемой. Вы должны объявить notVisible как частным членом этого класса.

__attribute__ ((visibility ("hidden"))) просто говорит динамический компоновщик, что вы не можете связать символ функции/переменной охранялись этим атрибутом.

Обратите внимание, что вы не можете скрыть символ из nm или objdump -T списка, независимо от того, это не "hidden" или "default". "default" означает, что функция/переменная, к которой применяется этот атрибут, должна быть экспортирована из нашей библиотеки, тогда как "hidden" нет.

 Смежные вопросы

  • Нет связанных вопросов^_^