Порядок аргументов в cygwin gcc 4.3 имеет значение при связывании с glib-2.0 - PullRequest
2 голосов
/ 13 апреля 2010

Я пытаюсь скомпилировать код, который работает на OS X и Linux, используя Cygwin. Однако я считаю, что порядок аргументов для gcc дает непредвиденные результаты.

Например, следующие ошибки:

gcc -std=gnu99 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lglib-2.0 -lintl -liconv -fgnu89-inline -fno-leading-underscore -o nb-learn.exe nb-learn.c

но работает следующее:

gcc -std=gnu99 -fgnu89-inline -fno-leading-underscore -o nb-learn.exe nb-learn.c -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lglib-2.0 -lintl -liconv

Может кто-нибудь объяснить, как это работает? Кроме того, есть ли методы или код, который я могу использовать для получения autoconf для изменения порядка аргументов в зависимости от платформы?

Вот первые две строки сообщения об ошибке:

/cygdrive/c/Users/aischein/AppData/Local/Temp/cc9MvUsf.o:nb-learn.c:(.text+0x260): undefined reference to `_g_hash_table_size'
/cygdrive/c/Users/aischein/AppData/Local/Temp/cc9MvUsf.o:nb-learn.c:(.text+0x29c): undefined reference to `_g_hash_table_get_keys'

Спасибо

SetJmp (gcc 4.3.4)

1 Ответ

2 голосов
/ 15 апреля 2010

Документация GCC гласит:

-l библиотека

-l библиотека

Поиск библиотеки с именем библиотека при связывании. (Второй вариант с библиотекой в ​​качестве отдельного аргумента предназначен только для соответствия POSIX и не рекомендуется.)

Имеет значение, где в команде вы пишете эту опцию; компоновщик ищет и обрабатывает библиотеки и объектные файлы в указанном порядке.

Таким образом, `foo.o -lz bar.o 'ищет библиотеку` z' после файла foo.o, но до bar.o. Если bar.o относится к функциям в `z ', эти функции могут не загружаться.


Опции -Wl,--start-group и -Wl,--end-group иногда полезны для избежания таких проблем.


Все это не проблема, если вы используете только общие библиотеки.

...