Обычным поведением компоновщиков является извлечение объектного модуля из библиотеки тогда и только тогда, когда этот модуль определяет символ, который используется, но не разрешен в создаваемом исполняемом файле.
Это важно и необходимоповедение, чтобы избежать конфликтов между символами в программах и символами в библиотечных модулях, которые автор не использовал.В более поздних языках, таких как C ++, эта проблема решалась путем разделения пространств имен (например, std::
).Но, как правило, нам приходится иметь дело с тем фактом, что многие авторы естественным образом используют имена для своих собственных подпрограмм или объектов, таких как read
или write
, которые конфликтуют с подпрограммами библиотеки.Линкеры должны это разрешать.
Итак, когда ваша программа определяет socket
, компоновщик разрешает это определение и не берет его из библиотеки.Компоновщик не знает, что код в одном из ваших модулей использует socket
как функцию, в то время как определение в другом модуле относится к объекту.