2013-05-20 5 views
1

Я пишу большую статическую библиотеку в C++. В этой библиотеке я использую символы из множества статических и динамических библиотек. Когда я «делаю» это, мне не нужно связываться с любыми lib, потому что это статично. Вот моя проблема: моя статическая библиотека очень generic. Он предоставляет несколько реализаций для одного и того же интерфейса (вы можете увидеть реализации, такие как драйверы; libA предоставляет собственную реализацию и libB и т. Д.). Эти реализации являются , которые не предназначены для использования вместе, поскольку некоторые из них зависят от платформы.Условное соединение через статическую библиотеку

Проблемы возникают при соединении с моей библиотекой. Клиенты должны связываться со всеми libs, которые использовали мои lib, даже если код клиента не зависит от какого-либо символа lib. Например, если код клиента зависит только от libA, он все равно должен ссылаться на libB, потому что моя статическая библиотека имеет некоторые символы от libB.

Знаете ли вы способ предотвратить такое поведение и только ссылку на фактически используемые библиотеки, выводя символы в код клиента?

спасибо.

ответ

0

Возможно, вы динамически связываете свою библиотеку с другими библиотеками. Попробуйте установить связь со статическими версиями тезисов.

+0

символы могут быть из статических ** или ** динамических библиотек, я не могу ссылаться только на статику. – phaazon

0

Если я правильно понял, ваша библиотека пытается использовать символы, которые, как ожидается, будут defined по коду клиента. Вы хотели бы, чтобы линкер с not link определенными частями вашей библиотеки, если у кода клиента не было certain symbols. Правильно?

Если вышеуказанное соответствует вашему требованию, рассмотрите http://en.wikipedia.org/wiki/Weak_symbol. Я не уверен, какую цепочку инструментов вы используете, но если поддерживаемые слабые символы - это способ сглаживания условной привязки.

+0

да, это то, что я хочу. У моей статической библиотеки много статических символов, но я хочу, чтобы они не были экспортированы в финальную программу (так что нам все равно, определены ли они) – phaazon

+0

знаете ли вы, что clang ++ поддерживает такую ​​функцию? Я использую как g ++, так и clang ++ – phaazon

+0

@skp не уверен о 'clang ++', но 'GNU gcc (и g ++)' безусловно поддерживает эту функцию. Из небольшого числа поисковых запросов я убежден, что '#pragma weak' является соответствующей функцией в' clang ++'. Я предлагаю добавить таблицы g ++ и clang ++; что привлекло бы некоторых экспертов в этой области к комментариям. – Aravind

Смежные вопросы