2012-04-20 16 views
1

Мой Makefile выглядит следующим образомВключить библиотеки путь в Makefile

program_NAME := myprogram 
program_C_SRCS := $(wildcard *.cc) 
program_C_OBJS := ${program_C_SRCS:.cc=.o} 
program_OBJS := $(program_C_OBJS) 
program_INCLUDE_DIRS := ../INCLUDE 
program_LIBRARY_DIRS := 
program_LIBRARIES := 
CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir)) 
LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir)) 
LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library)) 

.PHONY: all clean distclean 

all: $(program_NAME) 

$(program_NAME): $(program_OBJS) 
$(LINK.cc) $(program_OBJS) -o $(program_NAME) 

clean: 
    @- $(RM) $(program_NAME) 
    @- $(RM) $(program_OBJS) 

distclean: clean 

Я создал библиотеку stack.a в некотором пути /home/Desktop/kk/stack. Я хочу включить эту библиотеку в свой файл makefile, чтобы во время связывания ее нужно было взять с этого пути.

Я попытался дать:

program_LIBRARY_DIRS := /home/Desktop/kk/stack 

и в связывании шага я дал:

$(LINK.cc) $(program_OBJS) stack.a -o $(program_NAME) 

Но Makefile не в состоянии подобрать библиотеку из пути упомянутого.

Вместо этого, если я прямо дать:

$(LINK.cc) $(program_OBJS) /home/Desktop/kk/stack/stack.a -o $(program_NAME) 

она прекрасно работает.

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

ответ

3

Опция -L ссылка относится только к библиотекам имени libX.a или libX.so и связаны с использованием -lX, для некоторой строки X. Вам нужно будет переименовать stack.a в libstack.a и обратиться к нему в командной строке как -lstack.

(Вы должны также, в идеале, положить, что в program_LIBRARIES определение и использовать его в $(LINK.cc) линии.)

+0

Спасибо geekosaur !!! В вышеприведенном make-файле я переименовал библиотеку, как вы предложили, и поместил местоположение каталога в библиотеку в program_LIBRARY_DIRS, а затем ее рабочий тон. Но когда я храню адрес библиотеки в program_LIBRARIES: = ../stack/libstack.a. В чем разница между этими двумя параметрами -l и -L? И если я даю абсолютный адрес библиотеки в program_LIBRARIES, то почему она терпит неудачу ..please clarify ... Спасибо –

+1

'program_LIBRARIES: = -lstack' - как вы должны использовать его, если вы его переименовали, и вы добавили исправить опцию '-L' пути к' program_LIBRARY_DIRS'. – geekosaur

Смежные вопросы