Вы должны думать, что командная строка компоновщика обрабатывается слева направо, так что ранее перечисленные элементы обрабатываются первыми.
Спецификации библиотеки
и -lXYZ
будут использоваться только для удовлетворения неразрешенных ссылок.
Другими словами:
gcc -o conftest -lintl conftest.c
на самом деле не будет иметь каких-либо неразрешенных ссылок, когда встретит -lintl
(конечно, кроме main
). Если вы используете:
gcc -o conftest conftest.c -lintl
затем, в точке, где встречается -lintl
, у вас будут неразрешенные ссылки, все используемые, но не определенные в conftest.c
.
Обычное решение - убедиться, что вы перечислили все спецификации библиотеки после других объектных / исходных файлов.
Вы также можете использовать опцию -u <symbol>
, чтобы сделать вид, что символ <symbol>
не определен, так что библиотека будет куплена в любом случае.
Я бы предпочел исправить порядок самостоятельно, и я так и не понял, почему gcc
просто не объединял спецификации библиотеки и просто продолжал искать, пока все символы не будут удовлетворены или больше не смогут (или хотя бы прови это как вариант).
В вашем случае вы можете просто использовать что-то вроде:
gcc -o conftest -u gettext -lintl conftest.c
И вы можете указать больше -u
опций для каждого символа, который вы хотите притвориться, не определено (т. Е. Ввести столько библиотек, сколько требуется).