Вы можете использовать ключевое слово static
как другие ответы предложил. Но иногда сама библиотека будет состоять из нескольких исходных и объектных файлов, и могут быть функции, которые должны использоваться во всей библиотеке, но не должны быть экспортированы после ссылки.
Простой пример:
Ваша библиотека имеет 3 объекта: lib1.o lib2.o util.o
Расположенный в util.o
несколько хелперов-функции, которые используются lib1.o
и lib2.o
. Вы не можете использовать static здесь, потому что функции не будут видны для них, и связь не сработает.
Что вы можете сделать:
Сделать хелперы-функции нестатическая и обеспечивают линкер с версии сценария в, которая только экспортирует необходимые символы:
gcc -shared lib1.o lib2.o util.o -o mylib.so -Wl,--version-script=map
Файл map
может иметь следующее содержание:
{
global:
bar;
baz;
local: *;
};
Это будет экспортировать только символы bar
и baz
(которые являются соответствующими API-функциями для этого примера lib), но при этом опуская все остальные символы из таблицы символов.
1. Пожалуйста, объясните, почему пользователь увидит функции, предоставит заголовок только с функциями, которые вы хотите экспортировать. 2. С MSVC вы должны явно экспортировать нужные символы, а gcc также имеет параметр видимости. 3. Нет, вы можете включать заголовок несколько раз при условии, что он содержит защитные устройства. У них есть стандартные заголовки библиотек. –
Я имею в виду, что у меня есть некоторая функция: tmp1, tmp2, tmp3, которые используются функцией func. И я хочу, чтобы только func был видимым пользователем, как в стандартной библиотеке. Поэтому include и программист могут использовать только func, а не tmp1, tmp2, tmp3 – Edison91
Вы объявляете их 'static', и у них будет область файлов (* это очень распространенная техника *). Но если вы не публикуете код и почему у вас проблемы, вам это не поможет. –