Порядок параметров gcc/g++

Я только что скомпилировал chironfs на моем новом сервере Ubuntu 12.10 и получил следующую ошибку:

gcc  -Wall -W -Wmissing-prototypes -g -O2 -DFUSE_USE_VERSION=25 -D_FILE_OFFSET_BITS=64 -I/usr/local/include -g -O2 -lm -lfuse  -o chironfs chironfs.o chiron-conf.o chirondbg.o chironfn.o  
chironfs.o: In function `chiron_init':
/root/chironfs-1.1.1/src/chironfs.c:2000: undefined reference to `pthread_create'
chironfs.o: In function `get_rights_by_name':
/root/chironfs-1.1.1/src/chironfs.c:452: undefined reference to `fuse_get_context'

ошибка pthread говорит мне, что -lpthread отсутствует, но ошибка fuse довольно странная, потому что используется -lfuse

я нашел решение, которое предлагает поставить библиотеки после объектных файлов

поэтому я удалил -lfuse и добавил -lfuse -lpthread в самом конце строки

теперь он компилируется без ошибок и кажется, что так и должно быть: библиотека после объектных файлов

мой вопрос: почему порядок параметров имеет значение для gcc/ld? я думал, что gcc просто разбирает параметры, как и любое другое приложение, и может переслать необходимые параметры в ld или что-то подобное.

в общем: кто-нибудь знает факты или советы по упорядочению параметров gcc и, возможно, немного справочной информации о том, зачем это нужно?

Спасибо

2 ответа

Решение

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

GCC сам передает параметры в ld относительно прозрачно

Ваш вопрос действительно о том, как работает ld linker. Для простоты и обработки циклических ссылок без бесконечных циклов, он проходит список библиотек только один раз, разрешая ссылки. Так что, если ваша ссылка где-то встречается, и она еще не видела библиотеку, в которой она содержится, это просто ошибка.

Также, пожалуйста, прочитайте эту дискуссию, где этот вопрос обсуждается более подробно.

Другие вопросы по тегам