Параметр gcc / mingw / windows: -l работает, только если указан в конце строки - PullRequest
1 голос
/ 31 июля 2011

Моя проблема заключается в следующем:

У меня есть небольшая программа ниже (см. Файл conftest.c).

(1) Если я скомпилирую conftest.c следующим образом (с -l в конце):

gcc -o conftest conftest.c -lintl

отлично компилируется.

(2) Но если я скомпилирую conftest.c следующим образом (с -l в конце):

gcc -o conftest -lintl conftest.c

компиляция завершается с ошибкой: C: \ Users \ devel \ AppData \ Local \ Temp \ cce00i8m.o: conftest.c :(. Text + 0x16): ссылка на версию « imp _libintl_gettext» collect2: ld вернул 1 статус выхода.

Я использую mingw с gcc 4.5.0 под windows. gcc установлен в / mingw / bin

Похоже, порядок передачи опций -l в gcc имеет значение. Это очень раздражает, потому что я пытаюсь установить Bundle :: Gnome2 Perl ActiveState, и он использует конструкцию (2). Кто-нибудь знает, как это исправить и заставить (2) работать?

Заранее спасибо,


conftest.c:

#include <libintl.h>
int main(int argc, char **argv)
{
    char *x = gettext("foo");return 0;
}

Ответы [ 2 ]

0 голосов
/ 31 июля 2011

У gcc есть режим закрытия, в котором он будет сканировать предоставленные библиотеки до тошноты, как описано в paxdiablo. Работает с --start-group и --end-group, например

gcc -o conftest --start-group -lintl conftest.c --end-group

Цитирую руководство: «Использование этого параметра требует значительных затрат на производительность. Лучше использовать его только при наличии неизбежных циклических ссылок между двумя или более архивами».

0 голосов
/ 31 июля 2011

Вы должны думать, что командная строка компоновщика обрабатывается слева направо, так что ранее перечисленные элементы обрабатываются первыми.

Спецификации библиотеки

и -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 опций для каждого символа, который вы хотите притвориться, не определено (т. Е. Ввести столько библиотек, сколько требуется).

...