GCC Аргумент командной строки Pickiness - PullRequest
7 голосов
/ 06 июня 2011

GCC может быть довольно требователен к порядку, в котором он принимает свои аргументы:

# Works.
g++ Foo.cpp -L. -I. -lBar -o Foo

# Linker errors.
g++ -o Foo -I. -L. -lBar Foo.cpp

Каковы, в частности, требования к порядку для параметров командной строки?

1 Ответ

7 голосов
/ 06 июня 2011

Библиотеки загружаются по требованию на основе символов, требуемых от них, поэтому библиотека, которая предоставляет символ, необходимый для чего-то другого, должна следовать за этим чем-то другим.Это историческое;возможно, современная система должна разрешать символы автоматически, разумно обрабатывая циклы (это и есть причина для правила; вы прерывали циклы зависимостей вручную, указывая библиотеки по порядку и столько раз, сколько необходимо), но g++ следует традиционному правилу, поэтомуработа с вендором ld с.(GNU ld не работает везде, поэтому было бы невозможно полагаться на него для разрешения циклов зависимости символов. Существуют также проблемы с загрузкой даже на платформах, где GNU ld работает.) Точно так же и другие линкеры.ориентированные параметры должны быть указаны в правильном порядке относительно того, на что они влияют (например, параметр -L должен предшествовать библиотеке, которая находится в указанном каталоге; это может быть важно, если библиотека в одном каталоге скрывает библиотекуто же имя в стандартном каталоге).

...