Makefile с pthread не будет правильно компилироваться с несколькими версиями - PullRequest
0 голосов
/ 11 марта 2019

Для проекта мне нужно создать простой make-файл для исходного кода, который включает в себя pthreads и аргументы командной строки (если они нужны).

Первая версия make-файла, которая не работала, была такой:

 mr: mr.o
    g++ -std=c++11 -pthread mr.o -o mr
 mr.o: mapred.cc
    g++ -std=c++11 -pthread -c mapred.cc
 clean:
    rm *.o mr

и я получил следующую ошибку, что объектный файл не существует? enter image description here

Итак, я решил перевернуть два первых утверждения:

mr.o: mapred.cc
   g++ -std=c++11 -pthread -c mapred.cc 
mr: mr.o
   g++ -std=c++11 -pthread mr.o -o mr 
clean:
   rm *.o mr

и это компилируется, вроде? Все, что я получаю в терминале:

g++ -std=c++11 -pthread -c mapred.cc

и ничего больше. Когда я смотрю, какие файлы были созданы, я вижу только новый файл mapred.o, но без исполняемого файла. Так что никаких ошибок, но не полностью завершено. Если вы, ребята, есть какие-либо советы, чтобы помочь мне, это было бы очень признательно. Спасибо!

1 Ответ

1 голос
/ 11 марта 2019

Если вы не укажете явное имя вывода с параметром -o, то компилятор назовет объектный файл так же, как исходный файл, но с суффиксом .o.

В вашем случае команда

g++ -std=c++11 -pthread -c mapred.cc

создаст объектный файл с именем mapread.o.

Либо используйте mapread.o для целевых имен и при связывании, либо используйте параметр -o:

g++ -std=c++11 -pthread -c mapred.cc -o mr.o

Что касается вашей второй проблемы, если вы не укажете явную цель при вызове make, она будет использовать только первую цель 1019 * и ничего больше.

...