Каково использование флагов -I и -L в make-файле?В чем разница между -I и -L в make-файле?
ответ
Обычно они входят в командную строку компоновщика и поставляются непосредственно в целевом действии или чаще назначаются переменной 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
являются наиболее очевидными) не удастся, если соединение выполняется в неправильном порядке.
https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html: > LDFLAGS Дополнительные флаги, предоставляемые компиляторам, когда они должны ссылаться на компоновщик 'ld', например -L. Библиотеки (-lfoo) должны быть добавлены к переменной LDLIBS. > LDLIBS Библиотечные флаги или имена, предоставленные компиляторам, когда они должны вызывать компоновщик, 'ld'. LOADLIBES - устаревшая (но все же поддерживаемая) альтернатива LDLIBS. Некластерные флаги компоновщика, такие как -L, должны идти в переменной LDFLAGS. –
Следует отметить, что это опции, переданные компилятору/компоновщику. Итак, вы должны смотреть на страницы/документацию компилятора, чтобы узнать их роль.
Чтобы действительно получить файл makefile, вам также необходимо хорошо понимать командные строки для всех компонентов инструментальной цепочки вашего проекта. Такие опции, как -I
и -L
, не понятны самим собой. Скорее, make пытается создать командную строку, которая будет запускать инструмент для преобразования файла требуемого файла в целевой файл.
Часто это исходный файл C или C++, скомпилированный в объектный файл и в конечном итоге связанный с получением исполняемого файла.
В этом случае вам необходимо увидеть руководство для вашего компилятора, и особенно бит, относящийся к параметрам командной строки, которые он понимает.
Все, что сказано в общих терминах, эти конкретные варианты довольно стандартизированы среди компиляторов и линкеров. -I
добавляет каталог в список мест, найденных компилятором для файла с именем в строке #include
, а -L
добавляет каталог в список мест, поиск которых выполняется компоновщиком для библиотеки с именем с параметром -l
.
Суть заключается в том, что «язык» из Makefile представляет собой комбинацию синтаксиса самого Makefile, свою оболочку, как известно, чтобы сделать (обычно /bin/sh
или что-то подобное), общие команды оболочки (например, как rm
, cp
, install
и т. Д.) И команды, специфичные для вашего компилятора и компоновщика (например,набрав gcc -v --help
в командной строке оболочки, вы получите почти полный (и очень длинный) список опций, понятых gcc как одну отправную точку).
Я до сих пор не знаю, что является самым эффективным способом представления -I флага? -L можно перевести в LDFLAGS. – Edmon
Jinx, вы спрашивали о вариантах в $ LDFLAGS или в качестве переключателя для make, как в этом? make -l –
@ Nathan..the прежний, но вариант - это капитал «i» не «l». – MainID