J'ai:gcc cacher la visibilité des symboles provenant de la bibliothèque statique inclus
- une bibliothèque partagée, disent libShared.so, qui contient une classe
Bar
, avec une méthodeint Bar::do(int d) const
- une bibliothèque statique, dire libStatic.a, qui contient une classe
Foo
, avec une méthodeint Foo::act(int a) const
.
Le code de Bar
est quelque chose comme ceci:
//Bar.h
class __attribute__ ((visibility ("default"))) Bar
{
private:
__attribute__ ((visibility ("hidden"))) int privateMethod(int x) const;
public:
Bar() {}
int do(int d) const;
}
//Bar.cpp
#include "Bar.h"
#include "Foo.h"
int Bar::do(int d) const {
Foo foo;
int result = foo.act(d) + this->privateMethod(d);
return result;
}
libShared.so est compilé avec le drapeau -fvisibility = caché.
Le problème est le suivant: I exécuter la commande Linux nm -g -D -C --defined seule libShared.so, et il en résulte que classe Foo, ainsi que son procédé, est visible à l'extérieur libShared.so, malgré avoir dit au compilateur de tout cacher sauf ce qui est marqué comme "public" (en fait, ils sont marqués comme "T" par nm).
Comment puis-je éviter cela? Je veux libShared.so de ne pas exposer les symboles provenant de ses dépendances.
Merci
Désolé, mais cela n'empêchera pas _libShared.so_ d'utiliser _Foo_? – Mauro
Je me réponds. Ça marche! Je suppose que c'est parce qu'une liaison statique ne supporte pas les symboles qui se cachent, donc le drapeau _hidden_ ne prendra effet que lorsque les objets de la bibliothèque statique seront utilisés à l'intérieur d'un lien partagé. Merci beaucoup! – Mauro