2015-02-01 5 views
4

Обратите внимание, что это не дубликат других вопросов с именем generic makefile.Generic Makefile не работает на FreeBSD

Я следовал всем инструкциям по другим вопросам о родовых Makefiles, и это код, который я придумал от:

CFLAGS = -c 
CC = cc 
SOURCES = $(wildcard *.cc) 
OBJECTS = $(patsubst %.cc,%.o,%(SOURCES)) 
EXEC = run 

all: build clean 

build: $(OBJECTS) 
    $(CC) $(OBJECTS) -o $(EXEC) 

%.o: %.cc 
    $(CC) $(CFLAGS) $< 

clean: 
    rm *.o 

Однако, когда я исполняю make с файлом под названием test.cc в мой каталог, он дает мне ошибку: followig

cc -o run 
cc: error: no input files 
*** Error code 1 

Stop. 
make: stopped in /somewhere 

Обратите внимание, что я на FreeBSD и команды make и cc являются те, которые приходят с ОС.

+0

Примечание. Если файлы * .cc содержат C++, вы должны использовать компилятор C++. 'CC = cc', скорее всего, является компилятором C. – Jens

ответ

5

Линии

SOURCES = $(wildcard *.cc) 
OBJECTS = $(patsubst %.cc,%.o,%(SOURCES)) 

являются GNU сделать синтаксис, не понят файле FreeBSD make, который имеет свой собственный диалект (в частности $(wildcard) и $(patsubst)). Если вам нужно написать make-файлы, переносимые во многие системы, либо требуется, чтобы gmake существовал и использовал GNUmakefiles, либо придерживался features of POSIX make.

Вы можете установить GNU сделать (gmake) на FreeBSD с

cd /usr/ports/devel/gmake 
make install clean 
+0

Что было бы версией freebsd этих двух строк? – antifriz

1

make на FreeBSD отличается от команды GMake (make на большинстве систем Linux), и для этих функций требуется GMake. Вместо этого выполните команду gmake.

Я не знаком с тем, какие функции требуют GMake.

1

В файле FreeBSD make, вы можете сделать это следующим образом:

SOURCES!= ls *.cc 
OBJECTS = ${SOURCES:.cc=.o} 

Первая строка использует модификатор переменной назначения , Разверните значение и передайте его в оболочку для выполнения и присвойте результат переменной. Любые символы новой строки в результате заменяются пробелами. Это очень мощный механизм. Вы должны, например, используйте find вместо ls, чтобы также искать в подкаталогах;

SOURCES!= find . -type f -name '*.cc' 

Вторая строка использует переменную модификатор для выполнения АТ & T System V UNIX стиль подстановки переменных. Он заменяет суффикс .cc суффиксом .o.

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

  • Нет связанных вопросов^_^