В чем разница между -I и -L в make-файле? - PullRequest
50 голосов
/ 06 февраля 2009

Как используются флаги -I и -L в make-файле?

Ответы [ 3 ]

88 голосов
/ 06 февраля 2009

Обычно они являются частью командной строки компоновщика и либо поставляются непосредственно в целевом действии, либо чаще присваиваются переменной make, которая будет расширена для формирования команды ссылки. В этом случае:

-L - это путь к каталогам, содержащим библиотеки. Путь поиска для библиотек.

-l - это название библиотеки, на которую вы хотите сослаться.

Например, если вы хотите создать ссылку на библиотеку ~/libs/libabc.a, добавьте:

-L$(HOME)/libs -labc

Чтобы воспользоваться неявным правилом по умолчанию для связывания, добавьте эти флаги в переменную LDFLAGS, как в

LDFLAGS+=-L$(HOME)/libs -labc

Хорошая привычка - разделять LDFLAGS и LIBS, например

# LDFLAGS contains flags passed to the compiler for use during linking
LDFLAGS = -Wl,--hash-style=both
# LIBS contains libraries to link with
LIBS = -L$(HOME)/libs -labc
program: a.o b.o c.o
        $(CC) $(LDFLAGS) $^ $(LIBS) -o $@
        # or if you really want to call ld directly,
        # $(LD) $(LDFLAGS:-Wl,%=%) $^ $(LIBS) -o $@

Даже если это может работать иначе, директивы -l... должны идти после объектов, которые ссылаются на эти символы. Некоторые оптимизации (-Wl,--as-needed является наиболее очевидным) завершатся неудачно, если связывание выполнено в неправильном порядке.

25 голосов
/ 20 февраля 2009

Чтобы действительно получить make-файл, вам также необходимо хорошо понимать командные строки для всех компонентов инструментальной цепочки вашего проекта. Такие параметры, как -I и -L, не понимаются самим make. Скорее, make пытается создать командную строку, которая запустит инструмент для преобразования файла предварительных требований в целевой файл.

Часто это исходный файл C или C ++, который компилируется в объектный файл и в конечном итоге связывается для получения исполняемого файла.

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

Все эти общие параметры довольно стандартны для компиляторов и компоновщиков. -I добавляет каталог в список мест, в которых выполняется поиск компилятором для файла с именем в строке #include, а -L добавляет каталог в список мест, в которых выполняется поиск компоновщиком для библиотеки, названной с помощью -l опция.

Суть в том, что «язык» make-файла представляет собой комбинацию синтаксиса самого make-файла, вашей оболочки, о которой известно, что она делает (обычно /bin/sh или что-то подобное), общих команд оболочки (таких как * 1016). *, cp, install и т. Д.), А также команды, специфичные для вашего компилятора и компоновщика (например, набрав gcc -v --help в командной строке, вы получите почти полный (и очень длинный) список параметров, понятных для gcc как одна отправная точка).

1 голос
/ 06 февраля 2009

Следует отметить, что эти параметры передаются компилятору / компоновщику. Так что вы должны заглянуть в справочные страницы / документацию компилятора, чтобы узнать их роль.

...