У меня есть файл, который содержит следующее:
#include <map>
class A {};
void doSomething() {
std::map<int, A> m;
}
При компиляции в общую библиотеку с g++ библиотека содержит динамические символы для всех методов std::map<int, A>
. Поскольку A
является приватным для этого файла, нет возможности, чтобы std::map
был создан в любой другой разделяемой библиотеке с теми же параметрами, поэтому я хотел бы скрыть скрытие шаблона (по некоторым причинам, описанным в этот документ).
Я думал, что смогу сделать это, добавив явное создание класса шаблона и пометив его как скрытое:
#include <map>
class A {};
template class __attribute__((visibility ("hidden"))) std::map<int, A>;
void doSomething() {
std::map<int, A> m;
}
Однако это не влияет: символы все еще экспортируются. Я также попытался окружить весь файл:
#pragma GCC visibility push(hidden)
...
#pragma GCC visibility pop
но это также не влияет на видимость методов std::map<int, A>
(хотя и скрывает doSomething
). Точно так же компиляция с помощью -fvisibility=hidden
не влияет на видимость методов std::map<int, A>
.
Документ, который я связал выше, описывает использование экспортных карт для ограничения видимости, но это кажется очень утомительным.
Есть ли способ сделать то, что я хочу в g++ (кроме использования экспортных карт)? Если так, то, что это? Если нет, есть ли веская причина, почему эти символы всегда должны быть экспортированы или это просто упущение в g++?