Каково использование флагов -I и -L в make файле?
В чем разница между -I и -L в make файле?
Ответ 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
Следует отметить, что это опции, переданные компилятору/компоновщику. Поэтому вы должны смотреть на страницы/документацию компилятора, чтобы узнать их роль.