Что касается моих практических тестов, то при связывании статической библиотеки (.lib
) в ваш исполняемый файл в Visual-C ++, если какой-либо исполняемый файл .obj определяет дубликат символа в статической библиотеке, символ в статической библиотеке будет молча игнорируется.
Подтвердите (18 февраля 2010 в 17:46 Майкл Берр):
MSVC вел себя так, что если в файле .obj определен символ
и .lib будет использовать файл в файле .obj без предупреждения. я
Напомним, что он также будет обрабатывать ситуацию, когда символ
определенный в нескольких библиотеках, он будет использовать тот в библиотеке с именем
первый в списке.Не могу сказать, что пробовал это некоторое время, но я был бы удивлен, если бы они
изменил это поведение (особенно то, что .obj определил переопределение символов
символы в .lib файлах).Краткий тест с VS 2010 RC показывает, что описанное мной поведение все еще там.
(«Статическая библиотека Windows с функциями по умолчанию» также является подтверждением мне)
Теперь, во-первых, я бы хотел оказаться ошибочным, но, по крайней мере, для обычной функции C ++, похоже, так оно и есть.
Во-вторых, есть ли способ предотвратить это? У меня есть функция, что когда какие-либо двоичные ссылки на статическую библиотеку, содержащую эту функцию, я хотел бы подтвердить, что версия из статической библиотеки является фактически используется, а не какой-то остаток или что-то еще в другом проекте. (Примечание: Fn в вопросе test_suite* init_unit_test_suite(int argc, char* argv[])
, (*) так что я практически не могу изменить его, потому что он из сторонней библиотеки.)
(*): Это основная функция Boost.Test, которая должна предоставляться нашей собственной статической библиотекой. Если какой-либо разработчик создает проект модульного теста, который автоматически связывается со статической библиотекой через лист свойств, но также ошибочно определяет функцию, сборка должна прерваться вместо использования предоставленной разработчиком функции.
Я думаю, что компоновщик ведет себя по-другому, если вы ссылаетесь на независимый файл obj, не упакованный в статическую библиотеку. По крайней мере, вы должны получить предупреждение / ошибку о двойственности символов.
Когда мне нужно что-то подобное Некоторое время назад я тоже не смог найти его в наборе инструментов MS, но есть два устройства MS, которые подходят и могут быть полезны: __declspec (selectany) и недокументированные #pragma / alternatename. Возможно, ссылка на файл obj и объявление символа как selectany сделают свое дело? Если нет, возможно, добавление комментария #pragma (компоновщик, «/ alternatename: _YourSymbol = _DefaultExeSymbol») в файл exe-obj сделает это.