Подтвердить что ты не робот

В чем разница между -I и -L в make файле?

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

4b9b3361

Ответ 1

Они обычно входят в командную строку компоновщика и либо передаются непосредственно в целевом действии, либо чаще назначаются переменной 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 [email protected]
        # or if you really want to call ld directly,
        # $(LD) $(LDFLAGS:-Wl,%=%) $^ $(LIBS) -o [email protected]

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

Ответ 2

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

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

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

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

Суть в том, что "язык" make файла является комбинацией синтаксиса самого файла makefile, вашей оболочки, как известно, для создания (обычно /bin/sh или чего-то подобного), общих команд оболочки (таких как rm, cp, install и т.д.), а команды, специфичные для вашего компилятора и компоновщика (например, набрав gcc -v --help в командной строке оболочки, вы получите почти полный (и чрезвычайно длинный) список опций, понятых gcc как одна начальная точка).

Ответ 3

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