скрывать приватные символы автоматически - PullRequest
0 голосов
/ 24 июня 2018

У меня есть проект C ++ с открытыми и закрытыми заголовочными файлами.Чтобы увеличить инкапсуляцию и уменьшить конфликт символов в более крупном проекте, я хотел бы экспортировать только минимальный набор символов.

Хотя мы могли бы вручную аннотировать каждую функцию с атрибутами видимости, я бы предпочел подход, который не требуетизменение исходного кода.

Учитывая следующую структуру проекта:

LibA
  include
    *.h
  src
    *.h
    *.cpp

Есть ли способ автоматически скрывать все символы, которые не отображаются в include/*.h?

Есть ли элегантный способ инструментирования компилятора / компоновщика?Можем ли мы автоматически сгенерировать версию-скрипт?

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Можем ли мы автоматически сгенерировать версию-скрипт?

Вы можете: запустить nm -C *.o | egrep ' [TDBW] ', чтобы получить список глобальных символов, а затем заглянуть в include/*.h, чтобы увидеть, какие из них следует экспортировать. Это, вероятно, будет хрупким: если вы, например, используйте макросы для генерации имен символов, это, вероятно, не будет работать вообще.

Может быть, стоит сгенерировать список один раз, составить его вручную, а затем вручную сохранить его вместе с источниками в системе контроля версий.

Если количество экспортируемых символов относительно невелико, компиляция с -fvisibility-hidden и аннотирование только общедоступных символов является гораздо более надежным решением.

0 голосов
/ 24 июня 2018

С gcc и clang это так же просто, как с -fvisibility=hidden. Тогда вам нужно только явно экспортировать несколько открытых символов, которые вы хотите открыть.

Для получения более подробной информации, вы можете прочитать статью gcc о символьной видимости .

...