Исполняемый файл Makefile не создан - PullRequest
0 голосов
/ 23 ноября 2018
CC=g++ 
CFLAGS=-c -o 
PROG=craps 
LIBSRCS=craps.cpp craps_game.cpp craps_helper.cpp craps_io.cpp
LIBOBJS=$(patsubst %.cpp, %.o, $(LIBSRCS)) 
LIBCRAPS=craps 
CXXFLAGS=-I./ -fpic 
LDFLAGS=-L./ 

all: $(PROG) 

$(PROG): $(LIBSRCS) 
       $(CC) $(LDFLAGS) -l$(PROG) -o $(PROG) $(PROG).o 

$(LIBCRAPS): $(LIBOBJS) 
       $(CC) -shared -o lib$(LIBCRAPS).so $(LIBOBJS) 

%.o: %.cpp 
     $(CC) $(CXXFLAGS) -c -o $@ $ 

depend:
    ${CC} -MM ${PROG}.cpp ${LIBSCRS} > depends.mak

include depends.mak

Почему исполняемый файл не скомпилирован и не создан?

Все файлы o сгенерированы без ошибок.

Почему эта строка $(CC) $(LDFLAGS) -l$(PROG) -o $(PROG) $(PROG).o не запускается?что не так?

1 Ответ

0 голосов
/ 23 ноября 2018

Вы неправильно поняли мой комментарий.Я говорю это так:

PROG=craps LIBSRCS=craps.cpp craps_game.cpp craps_helper.cpp craps_io.cpp

неправильно.Вы не можете назначить две переменные в одной строке в make-файле.Эти переменные должны выглядеть следующим образом:

PROG=craps
LIBSRCS=craps.cpp craps_game.cpp craps_helper.cpp craps_io.cpp

Я спрашиваю, выглядит ли последний как ваш фактический make-файл, или приведенный здесь пример просто неточный.

Также эти правила обаневерные символы новой строки:

 $(PROG): 
           $(LIBSRCS) $(CC) $(LDFLAGS) -l$(PROG) -o $(PROG) $(PROG).o 

 $(LIBCRAPS):  
           $(LIBOBJS) $(CC) -shared -o lib$(LIBCRAPS).so $(LIBOBJS) 

Вы добавляете списки необходимых компонентов $(LIBSRCS) и $(LIBOBJS) в рецепт (команды оболочки), используемый для построения цели.Предпосылки должны быть на одной линии с целью.Они должны выглядеть следующим образом:

 $(PROG): $(LIBSRCS)
           $(CC) $(LDFLAGS) -l$(PROG) -o $(PROG) $(PROG).o 

 $(LIBCRAPS): $(LIBOBJS)
           $(CC) -shared -o lib$(LIBCRAPS).so $(LIBOBJS) 

Это ваша проблема, ниже

Наконец, вы не можете иметь и программу, и цель с одинаковым именем:

PROG=craps
LIBCRAPS=craps

Вы можете создать только одну цель с заданным именем, поэтому значение обеих этих переменных не может быть craps.Возможно, вы хотели:

PROG = craps
LIBCRAPS = libcraps.so

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

 Makefile:15: warning: overriding recipe for target 'craps'
 Makefile:12: warning: ignoring old recipe for target 'craps'

Эти предупреждения объясняют, почему вы не видите вызванное правило компиляции: правило библиотеки переопределяет его так же, как в предупреждении.

Кроме того, вы должны иметь программу, зависящую от библиотеки (так какон связывает его) и объектный файл $(PROG).o, потому что в настоящее время make не знает, что его нужно собрать.И вам не нужно, чтобы это зависело от всех исходных файлов.Вы хотите что-то вроде:

$(PROG): $(LIBCRAPS) $(PROG).o
        $(CC) $(LDFLAGS) -l$(PROG) -o $(PROG) $(PROG).o 
...