2014-12-31 1 views
1

Если я использую функцию, которая имеет следующую подпись:Ссылка на два файла lib, имеющих одну и ту же подпись функции?

void foo(int i);

И эта функция существует в libxxx.lib, а также в libyyy.lib (но реализация для функции отличается в каждом файле Lib), так что произойдет, если я свяжу свой объектный файл с этими двумя файлами lib? Получу ли я ошибку, что функция существует в обоих файлах lib, или линкер выбирает случайную функцию или что-то еще?

+1

Как мог линкер выбрать случайную функцию? это не имеет смысла. –

+1

Похоже, вам нужно начать использовать пространства имен. – CoryKramer

+0

Это c или C++, вы должны выбрать один, потому что они разные. –

ответ

1

Обычно линкер должен получать только неразрешенные символы из статической библиотеки. Поэтому, если функция void foo(int i) вызывается из одного из объектных файлов, предоставленных компоновщику, она будет использовать версию, присутствующую в первой библиотеке, указанную в командной строке. Поскольку после того, как символ был найден в первой библиотеке, он больше не остается нерешенным при просмотре второго.

Было бы иначе, если бы один символ был определен в двух объектных файлах, потому что это привело бы к ошибке компоновщика.

И проблема трудно решить, если функция void foo(int i) вызывается из другой статической библиотеки, поскольку теперь она зависит от относительного порядка 3-х библиотек. Мой совет: если вы можете, вы должны избегать этого углового случая.

+0

, если функция была определена в двух объектных файлах, и если две функции были определены как «глобально видимые», тогда возникает ошибка компоновщика, однако если одна или обе функции были определены как «статические», то никакая ошибка компоновщика – user3629249

+0

IIRC , в командной строке компоновщик Microsoft позволяет вам указать статическую библиотеку либо как библиотеку (то есть, чтобы она была добавлена ​​только при необходимости), либо как один из исходных файлов (в этом случае она добавлена ​​независимо от того, что). Если вы делаете последнее для предпочтительной библиотеки, я считаю, что она должна гарантировать, что используется правильная функция. (OTOH, я не уверен, как настроить Visual Studio для создания правильной командной строки.) –