C ++ разделяемая библиотека показывает внутренние символы - PullRequest
2 голосов
/ 11 августа 2009

Я создал общую библиотеку (.dll, .so) с VC ++ 2008 и GCC. Проблема в том, что внутри обеих библиотек отображаются имена частных символов (классов, функций), и они не были экспортированы.

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

В GCC я сделал: Скомпилировано с -fvisibility = hidden и затем опубликовано с атрибутом ((видимость ("по умолчанию")))

В VC ++: __declspec (dllexport)

Спасибо!

Ответы [ 3 ]

1 голос
/ 11 августа 2009

Вы можете создать файл заголовка, чтобы скрыть внутренние имена функций и методов, которые вы хотите скрыть. Т.е. что-то вроде ниже (нужно немного включить охрану тоже)

#define someFunctionName1 sJkahe28273jwknd
#define someFunctionName2 lSKlajdwe98
#define someMethodName1   ksdKLJLKJl22fss
#define someMethodName2   lsk89hHHuhu7g

... и включите это в заголовочные файлы, где живут реальные определения.

1 голос
/ 11 августа 2009

Для цепочек инструментов GNU вы можете использовать команду th strip для удаления символов из объектных файлов. Для управления его поведением требуются различные параметры команды. Может делать что хочешь.

0 голосов
/ 11 августа 2009

Приватное ключевое слово, когда используется только для спецификации доступа эффективно работает во время компиляции и предназначен для помощи программистам, а не как функция безопасности - как вы узнали, реализована «конфиденциальность» используя лексические средства.

Легко видеть, что это должно быть так - если вы реализуете две частные функции с зависимостями между собой в двух отдельных файлах .cpp, компоновщик должен найти частные имена в результирующих файлах объектов (или библиотек).

Итог - C ++ не имеет функций защиты кода - если вы дадите кому-нибудь объектный код вашей программы, он всегда сможет его изучить.

...