2 votes

Makefile ne trouve pas les fichiers d'entrée dans le répertoire spécifié

Je travaille avec le Makefile suivant :

CFLAGS=-g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG $(OPTFLAGS)
LIBS=-ldl $(OPTLIBS)
PREFIX?=/usr/local

SOURCES=$(wildcard src/lcthw/*.c src/*.c)
OBJECTS=$(patsubst %.c,%.o,$(SOURCES))

TEST_SRC=$(wildcard tests/*_tests.c)
TESTS=$(patsubst %.c,%,$(TEST_SRC))

TARGET=build/libYOUR_LIBRARY.a
SO_TARGET=$(patsubst %.a,%.so,$(TARGET))

all: $(TARGET) $(SO_TARGET) tests

dev: CFLAGS=-g -Wall -Isrc -Wall -Wextra $(OPTFLAGS)
dev: all

$(TARGET): CFLAGS += -fPIC
$(TARGET): build $(OBJECTS)
   ar rcs $@ $(OBJECTS)
   ranlib $@

$(SO_TARGET): $(TARGET) $(OBJECTS)
   $(CC) -shared -o $@ $(OBJECTS)

build:
   @mkdir -p build
   @mkdir -p bin

# The Unit Tests
.PHONY: tests
tests: CFLAGS += $(TARGET)
tests: $(TESTS)
   sh ./tests/runtests.sh

valgrind:
   VALGRIND="valgrind --log-file=/tmp/valgrind-%p.log" $(MAKE)

# The Cleaner
clean:
   rm -rf build $(OBJECTS) $(TESTS)
   rm -f tests/tests.log
   find . -name "*.gc*" -exec rm {} \;
   rm -rf `find . -name "*.dSYM" -print`

install: all
   install -d $(DESTDIR)/$(PREFIX)/lib/
   install $(TARGET) $(DESTDIR)/$(PREFIX)/lib/

Et j'ai du mal avec cette ligne :

$(CC)   -shared -o  $@  $(OBJECTS)

Je reçois l'erreur suivante :

cc: fatal error: no input files

lorsque j'essaie d'exécuter l'une des commandes suivantes : make, make all et make dev. Pourquoi mon fichier make ne trouve-t-il pas les fichiers .c dans les répertoires que j'ai spécifiés ?

0voto

Vous devez spécifier les chemins d'accès complets dans cette ligne :

SOURCES=$(wildcard src/lcthw/ .c src/ .c)

Dans le cas contraire, cela devient une contrainte sur l'endroit à partir duquel vous pouvez exécuter la commande make. Il est possible que ce qui se passe, c'est que les caractères génériques ne sont pas développés depuis le répertoire où vous vous trouvez, $(CURDIR) Il est donc difficile pour lui de voir ces chemins.

Vous devriez essayer d'imprimer ces variables à partir de votre fichier makefile, en faisant :

$(info source=$(SOURCES))

Et si vos fichiers .obj sont placés à un autre endroit que les sources, vous devez en tenir compte en incluant également cet endroit dans le $(OBJECTS).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X