Не найдены файлы библиотеки, направленные в Makefile - PullRequest
9 голосов
/ 11 августа 2011

Я пытаюсь скомпилировать этот инструмент.Ниже приведено начало его Makefile:

CC      = gcc
CFLAGS  = -Wall -O2 -D TRACES
DFLAGS  = -g -Wall -o0
CPPFLAGS= $(INCLUDES:%=-I %)
LDFLAGS = $(LIBRARIES:%=-L %)
LDLIBS  = $(USED_TOOLS:%=-l%)

MY_FILES = 
INCLUDE_DIR     = ~/include

TOOLBOX_INC     = $(INCLUDE_DIR)/tools
TOOLBOX_LIB     = $(TOOLBOX_INC)
USED_TOOLS      = std_io stringutils 
INCLUDES    = $(TOOLBOX_INC)
LIBRARIES   = $(TOOLBOX_LIB)

У меня также есть ~ / include / tools, который после компиляции включает std_io.o, libstd_io.a, stringutils.o и libstringutils.a

Я получаю следующую ошибку:

gcc -L ~/include/tools rank.o counterexample.o -lstd_io -lstringutils -o rank
ld: library not found for -lstd_io
collect2: ld returned 1 exit status
make: *** [rank] Error 1

Я не уверен, что что-то не так, и почему он не находит файлы библиотеки.

Редактировать: Оказывается, я случайно оставил пробел между опциями -L и -I.Кроме того, пути должны были быть расширены, я думаю.Сейчас работает, спасибо!

1 Ответ

15 голосов
/ 26 августа 2011

Проблема заключается в использовании тильды в значении «Домашний каталог».Оболочка будет выполнять раскрытие тильды, только если тильда является первым символом без кавычек в слове.Makefiles никогда не расширяют тильду.Таким образом, в

gcc -L~/include ...

оболочка не не выполняет расширение тильды, и gcc будет искать каталог с именем "~ / include" в текущем каталоге.Но в

gcc -L ~/include ...

оболочка выполняет расширение тильды, и вместо этого gcc видит

gcc -L /usr/username/include ...

, что работает, как и ожидалось.Правильнее всего делать так, чтобы никогда не использовать расширение тильды для домашнего каталога, а просто использовать $ HOME соответствующим образом в Makefile, например,

INCLUDE_DIR     = $$HOME/include
...