Как получить конфликт всех символов от 2 статических библиотек в VC8 - PullRequest
0 голосов
/ 09 июня 2011

Скажем, у меня есть 2 статических библиотеки

ex1.a ex2.a

В обеих библиотеках я определю 10 одинаковых функций

При компиляции примера тестового кода произнесите "test.c ", я связываю обе статические библиотеки ex1.a и ex2.a

В" test.c "я вызову только 3 функции, затем получу ошибку компоновщика", одинаковые символы определены в обоихБиблиотеки ex1.a и ex2.a "Это нормально.

Мой вопрос здесь следующий: 1. Почему эта ошибка отображает только 3 функции как несколько определенных ... Почему бы не перечислить все 10 функций

  1. В VC8 Как мне перечислить все несколько определенных символов без фактического вызова этой функции в тестовом коде ...

Спасибо,

Ответы [ 2 ]

0 голосов
/ 16 июня 2011

Что вы испытываете, так это оптимизирующая часть компоновщика: по умолчанию он не включает код, на который нет ссылок.Компилятор создаст несколько объектных файлов с наиболее вероятными неразрешенными зависимостями (вызовы, которые не могут быть удовлетворены включенным кодом).Таким образом, компоновщик берет все переданные объектные файлы и пытается найти решения для неразрешенных зависимостей.Если это не удается, он проверит доступные файлы библиотеки.Если есть несколько вариантов с одним и тем же точным именем / подписью, он начнет жаловаться, потому что не сможет решить, какой из них выбрать (для идентичного кода это не имеет значения, но представьте себе разные реализации, использующие разные «закулисные» работы).в памяти, таких как отладка и выпуск).

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

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

0 голосов
/ 16 июня 2011

Это связано с тем, что компоновщик пытается повторно преобразовать имя символа, когда он компилирует и связывает код с вызовом функции.Только когда в коде есть несколько вызовов функций, компоновщик будет пытаться разрешить его либо в тестовом коде, либо в связанных библиотеках, и тогда он найдет несколько определений.Если никакая функция не вызывается, то я думаю, нет проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...