2009-02-06 3 views
41

Каково использование флагов -I и -L в make-файле?В чем разница между -I и -L в make-файле?

+0

Jinx, вы спрашивали о вариантах в $ LDFLAGS или в качестве переключателя для make, как в этом? make -l –

+0

@ Nathan..the прежний, но вариант - это капитал «i» не «l». – MainID

ответ

75

Обычно они входят в командную строку компоновщика и поставляются непосредственно в целевом действии или чаще назначаются переменной 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 являются наиболее очевидными) не удастся, если соединение выполняется в неправильном порядке.

+0

https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html: > LDFLAGS Дополнительные флаги, предоставляемые компиляторам, когда они должны ссылаться на компоновщик 'ld', например -L. Библиотеки (-lfoo) должны быть добавлены к переменной LDLIBS. > LDLIBS Библиотечные флаги или имена, предоставленные компиляторам, когда они должны вызывать компоновщик, 'ld'. LOADLIBES - устаревшая (но все же поддерживаемая) альтернатива LDLIBS. Некластерные флаги компоновщика, такие как -L, должны идти в переменной LDFLAGS. –

0

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

17

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

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

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

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

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

+0

Я до сих пор не знаю, что является самым эффективным способом представления -I флага? -L можно перевести в LDFLAGS. – Edmon