1) Я не знаю, зачем мне это нужно для функции. Может быть, кто-то еще может вмешаться.
2) Компоновщик определяет это, просматривая все объектные файлы и проверяя символы внутри каждого объектного файла. Я предполагаю, что в зависимости от вашего компоновщика, точный порядок поиска может отличаться.
Для GNU binutils 'ld все объектные файлы и библиотеки, которые появляются в командной строке компоновщика после поиска объекта, содержащего пропущенный символ, слева направо и выбирается первый найденный символ.
Пример 1:
- a.o - использует foo (), bar ()
- liba - обеспечивает бар ()
- libb - предоставляет foo ()
$> ld a.o -la -lb
приведет к поиску неопределенных символов. После этого ld будет проходить по библиотекам слева направо для поиска этих символов и найдет bar в liba и foo в libb.
Это может привести к странным проблемам при циклических зависимостях:
Пример 2:
- a.o - использует bar ()
- liba - предоставляет bar (), использует foo ()
- libb - предоставляет foo (), использует bar ()
Теперь существует круговая зависимость между liba и libb, и соединение не будет выполнено:
$> ld a.o -la -lb
потому что при поиске неопределенных символов в libb ld определит, что нет другой lib справа от -lb , предоставляющей этот символ. Это можно исправить как минимум двумя способами:
1) дважды связать liba:
$> ld a.o -la -lb -la
2) использовать функцию группировки ld
$> ld a.o --start-group -la -lb --end-group
В случае 2) группа указывает ld выполнить поиск по всем символам во всех библиотеках этой группы.