Как скрыть символы в статической библиотеке c ++? - PullRequest
1 голос
/ 16 мая 2019

Я буду модулировать ситуацию.В этом вопросе я использую Ubuntu 16.04 с GCC 6.5.0 и CMake 3.13.2.

У меня есть 4 статических библиотеки и один исполняемый файл: A, B, C, D и main.A имеют int add(int, int), которые просто добавляют 2 заданных целых числа.B имеют int addb(int, int), которые просто звонят add с A.C имеет int add(int, int), который умножает 2 заданных целых числа.D имеют void print(), которые звонят addb с B и add с Cmain просто звонит print().Все эти функции разбивают объявление и определение на .cpp и .hpp.

Схема:

A (add)
  |
B (addb)    C (add)
  |           |
  |___________|
        |
      D (print)
        |
       main

Что я должен сделать, чтобы скрыть add от A символа?Поскольку у меня есть умножение определения из ld, при связывании main.

Если я просто собираю с помощью cmake, он вызовет add из C в двух случаях (см. print() из D),Я связываю B с ld (ld -static), но теперь у меня есть две проблемы:

  • умножение определения add (сначала определено в A)
  • no .eh_frame_hdr table will be created

Также я пытался сделать A и C SHARED с помощью cmake, но он вызывает add из C, как и раньше.

Я исключил, что B будет "полной" статической библиотекой, без *UND*, и если я позвоню addb, он вызовет add из A, add вызовет из C.Спасибо!

1 Ответ

0 голосов
/ 16 мая 2019

Вы нарушаете одно правило определения . Коротко говоря, это говорит о том, что каждая функция (1) должна быть определена только один раз (если не объявлена ​​как inline, и в этом случае все определения должны быть одинаковыми).

То, что вы пытаетесь сделать, идиоматически делается с пространствами имен. Ваши библиотеки A, B, C объявят все свои функции в соответствующих пространствах имен.

Что-то вроде

namespace A
{
   int add(int lhs, int rhs);
};

namespace C
{
   int add(int lhs, int rhs);
}

(1) Одно правило определения касается не только функций. На уровне программы это также относится и к переменным, а в пределах данного модуля перевода это распространяется и на шаблоны, типы классов и перечисления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...