Столкнулся с такой проблемой при использовании динамической либы в Си. Допустим в библиотеке используется функция
uint16_t crc16_ccitt (const void *p, size_t size);
она используется исключительно внутри библиотеки в не объявлена в экспортируемых заголовочных файлах.
Если вдруг в приложении, где будет использоваться эта библиотека, есть функция с таким же именем, то из библиотеки вызывается именно эта пользовательская реализация… конкретно это я заметил исключительно потому, что у пользователя эта функция была объявлена как
uint16_t crc16_ccitt (size_t size, const void *p);
то есть параметры были поменяны местами и когда библиотека пыталась ее вызвать, приложение падало в segmentation fault.
Есть ли какой-то способ избежать таких эффектов и изолировать функции библиотеки от пользовательских функций с таким же именем, возможно, некоторая опция gcc?
Если нет, то как такую проблему решают в крупных проектах?
Библиотека собирается с такими опциями:
-fPIC -c -std=c11 -fplan9-extensions -Wall -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-format-zero-length