Подтвердить что ты не робот

G++ зависимость привязки порядка при связывании кода c с кодом С++

До сегодняшнего дня я всегда считал, что порядок, который объекты и библиотеки были переданы g++ во время стадии связывания, неважен. Затем, сегодня, я попытался связать код С++ с кодом c. Я завернул все заголовки C во внешнем блоке "C", но у компоновщика все еще были трудности с поиском символов, которые, как я знал, были в архивах объектов C.

В преломлении я создал относительно простой пример, чтобы изолировать ошибку связывания, но, к моему удивлению, более простой пример связан без каких-либо проблем.

После небольшого проб и ошибок я обнаружил, что, эмулируя шаблон привязки, используемый в простом примере, я мог бы получить основной код для ссылки OK. Сначала шаблон был объектным кодом, а второй - вторым, например:

g++ -o serverCpp serverCpp.o algoC.o libcrypto.a

Может кто-нибудь пролить свет на то, почему это может быть так? Я никогда не видел эту проблему при связывании обычного кода С++.

4b9b3361

Ответ 1

Порядок, в котором вы указываете объектные файлы и библиотеки, ОЧЕНЬ важна в GCC - если вы не были укушены этим, прежде чем вы проведете чарующую жизнь. Компилятор ищет символы в том порядке, в котором они появляются, поэтому, если у вас есть исходный файл, содержащий вызов функции библиотеки, вам нужно поместить его перед библиотекой, или компоновщик не будет знать, что он должен ее разрешить. Сложное использование библиотек может означать, что вам нужно указывать библиотеку более одного раза, что является сильной болью, чтобы получить право.

Ответ 2

Передача библиотеки в gcc/g++ действительно имеет значение. Если A зависит от B, сначала необходимо указать A. Причина в том, что он оптимизирует символы, на которые не ссылаются, поэтому, если он сначала видит библиотеку B, и никто не ссылался на нее в этой точке, она вообще ничего не свяжет с ней.

Ответ 3

Статическая библиотека представляет собой набор объектных файлов, сгруппированных в архив. При связывании с ним компоновщик выбирает только те объекты, которые ему нужны, чтобы разрешать любые символы undefined. Поскольку объекты связаны в порядке, указанном в командной строке, объекты из библиотеки будут включены только в том случае, если библиотека появляется после всех объектов, которые зависят от нее.

Поэтому порядок ссылок очень важен; если вы собираетесь использовать статические библиотеки, тогда вам нужно быть осторожным, чтобы отслеживать зависимости и не вводить циклические зависимости между библиотеками.