Я буду модулировать ситуацию.В этом вопросе я использую 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
с C
.И main
просто звонит 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
.Спасибо!