2013-05-30 8 views
0

Я пытаюсь собрать небольшой проект CPP (http://sourceforge.net/projects/ibmquestdatagen/) на Mac с помощью г ++, но я получаю следующее сообщение об ошибке:C++: .o файл не найден

sudo make -f Makefile.txt 

g++ -O ran1.o expdev.o gammln.o gasdev.o poidev.o dist.o gen.o main.o command.o -lm -o gen 
i686-apple-darwin11-llvm-g++-4.2: ran1.o: No such file or directory 
i686-apple-darwin11-llvm-g++-4.2: expdev.o: No such file or directory 
i686-apple-darwin11-llvm-g++-4.2: gammln.o: No such file or directory 
i686-apple-darwin11-llvm-g++-4.2: gasdev.o: No such file or directory 
i686-apple-darwin11-llvm-g++-4.2: poidev.o: No such file or directory 
i686-apple-darwin11-llvm-g++-4.2: dist.o: No such file or directory 
i686-apple-darwin11-llvm-g++-4.2: gen.o: No such file or directory 
i686-apple-darwin11-llvm-g++-4.2: main.o: No such file or directory 
i686-apple-darwin11-llvm-g++-4.2: command.o: No such file or directory 
make: *** [gen] Error 1 

Кажется, что У меня нет необходимых файлов .o. Есть ли способ их генерации?

Вот Makefile:

HFILES1 = glob.h dist.h 
HFILES2 = gen.h 

CFILES1 = ran1.C expdev.C gammln.C gasdev.C poidev.C dist.C 
CFILES2 = gen.C main.C command.C 

OBJECTS1 = ran1.o expdev.o gammln.o gasdev.o poidev.o dist.o 
OBJECTS2 = gen.o main.o command.o 

LIBES = -lm 
CC = g++ 
CFLAGS = -O 

.SUFFIXES: .C 

.C.o: 
    $(CC) $(CFLAGS) -c $*.c 

gen: $(OBJECTS1) $(OBJECTS2) 
    $(CC) $(CFLAGS) $(OBJECTS1) $(OBJECTS2) $(LIBES) -o gen 

test: $(OBJECTS1) test.o 
    $(CC) $(CFLAGS) $(OBJECTS1) test.o $(LIBES) -o test 

clean: 
    /bin/rm $(OBJECTS1) $(OBJECTS2) 

$(OBJECTS1): $(HFILES1) 
$(OBJECTS2): $(HFILES1) $(HFILES2) 

GNU Make 3.81

+3

Вы не должны запускать make как root (не используйте sudo). Является ли вывод, который вы получаете там, действительно все, что видите? И это действительно ваш make-файл, точно? Это не представляется возможным. Make не будет запускать вашу линию ссылок, если она не найдет файлы '.o' где-то, так как они указаны в качестве необходимых условий. Если вы не сделали что-то странное, как набор «VPATH» в вашей среде, make должен жаловаться на то, что он не знает, как построить 'ran1.o' и т. Д. – MadScientist

ответ

3

Попробуйте добавить пару строк в свой Makefile как:

.SUFFIXES: .C 

.C.o: 
    $(CC) $(CFLAGS) -c $*.c 

Большинство делает что-то подобное, что встроенный (который, вероятно, почему ее нет в Makefile вы получили), но, видимо, ваш не делает. Он может распознавать только другие расширения C++, такие как .cpp или .c++.

+0

Разве это не '% .o:% .c:'? –

+0

@ VladLazarenko: Некоторые версии 'make' поддерживают различный синтаксис; то, что я приводил выше, существует уже несколько десятилетий, поэтому я был бы немного удивлен, когда столкнулся с созданием, которое его не поддержало. –

+1

Синтаксис шаблона - это функция GNU make, которая будет работать в этом случае, поскольку Mac использует GNU make, хотя она не переносима для некоторых других систем, таких как Solaris, BSD и т. Д. (Если только вы не получите для них GNU). Версия правила суффикса поддерживается во всех (совместимых с POSIX) make, включая GNU make, но вы забыли добавить '.C' в список суффиксов. – MadScientist

1

"путь" для создания .o (объектный код) файлов компиляции исходных файлов.

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

+0

OP, похоже, знает, что вопрос заключается в том, почему не рассматривали это как часть неявного сканирования зависимостей. –

+0

@ VladLazarenko Я так не думаю. Он называет ошибку компоновщика «ошибкой компилятора» и, что еще более важно, он рассматривает возможность опускать объектные файлы при создании окончательного исполняемого файла.Я думаю, что это довольно простой признак того, что он не знает, что здесь происходит. –

2

Вы можете проверить, знает ли ваш «make», как создавать файлы .o из файлов .C, удаляя или комментируя последние две строки вашего файла makefile. список

#$(OBJECTS1): $(HFILES1) 
#$(OBJECTS2): $(HFILES1) $(HFILES2) 

Эти строки файлы .h в качестве предпосылок для .o файлов, так что кажется, что делают находит файлы .h и предполагает, что .o файлы хорошо идти. Если «make» не имеет неявного правила для создания файлов .o, вы можете добавить его, как указал Джерри в его ответе.

обновление: Если правило Джерри не работает в вашем Makefile, попробуйте следующее:

%.o : %.C 
    $(CC) $(CFLAGS) -c $< 
#make sure the line above is indented with a tab, not spaces 

Если это работает, попробуйте добавить две строки обратно в

обновления 2:. По какой-то причине ни одно из этих правил шаблонов, похоже, не работает для OP. Вот перебор путь:

foo.o : foo.C foo.h 
    $(CC) $(CFLAGS) -c foo.C 

Вы можете добавить один из этих правил для каждого из .c файлов, заменив «Foo» с соответствующим именем. Если вы сделаете это так, вам не нужны линии $(OBJECTS): $(HFILES).

+1

В этом случае вы теряете зависимость. Например, изменение файла заголовка не приведет к повторной компиляции. –

+0

@ Vlad, совершенно верно, что заставляет вас задаться вопросом, почему файлы .C также не указаны. В любом случае я предложил его как шаг устранения неполадок. Вероятно, это скорее комментарий, чем ответ. Я скоро его удалю. –

+0

, когда эти строки прокомментированы: make: *** Нет правила для создания target 'ran1.o ', необходимого для' gen'. Стоп. – ksiomelo

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