2016-01-07 2 views
0

У меня есть 2 класса: шаблон класса list.t с определением и реализацией и ticker.h и ticker.cpp вместе с программой драйвера main.cpp. Я хочу скомпилировать main.cpp, чтобы перейти к main.x, который использует как тикер, так и класс списка. Это мой файл makefile.Ошибка Makefile с шаблоном класса: clang warning linker input unused

# makefile for fx project 

CC = g++ 
CFLAGS = -g -Wall -Wextra 

default: main.x 

main.x: main.o ticker.o list.o 
    $(CC) $(CFLAGS) -o [email protected] main.o list.o ticker.o 

list.o: list.t 
    $(CC) -c list.t 

ticker.o: ticker.cpp 
     $(CC) -c ticker.cpp list.t 

main.o: list.t ticker.cpp main.cpp 
    $(CC) -c main.cpp ticker.cpp list.t 

Но выполнив команду сделайте я получаю следующее сообщение об ошибке:

make 
g++ -c main.cpp ticker.cpp list.t 
clang: warning: list.t: 'linker' input unused 
g++ -c list.t 
clang: warning: list.t: 'linker' input unused 
g++ -g -Wall -Wextra -o main.x main.o list.o ticker.o 
clang: error: no such file or directory: 'list.o' 
make: *** [main.x] Error 1 

List.t - (без реализации)

#ifndef LIST_T 
#define LIST_T 

#include <iostream> 

template <typename T> 
class List 
{ 
public: 
    // constructors 
    List(); 
    List(T); 
    List(const List&); 
    ~List(); 

    // member functions 
    List& operator = (const List&); 
    void PushFront (const T&); 
    void PushBack (const T&); 
    T PopFront(); 
    T PopBack(); 
    T& Front(); 
    T& Back(); 
    const T& Front() const; 
    const T& Back() const; 
    size_t Size() const; 
    bool Empty() const; 
    void Clear(); 
    void Display (std::ostream&, char = '\0') const; 

    //private vars 
    private: 
    class Link 
    { 
     Link (const T& t) : element_(t), nextLink_(0), previousLink_(0) {}; 
     T element_; 
     Link* nextLink_; 
     Link* previousLink_; 
     friend class List<T>; 
    }; 
    Link* firstLink_; 
    Link* lastLink_; 
    }; 

Я уверен, что это просто ошибка , и я просмотрел google для этого сообщения об ошибке, но я либо не полностью понимаю их решения, либо они не работают для меня. В любом случае, дайте мне знать, есть ли у вас решение этой проблемы или какие-либо другие комментарии о качестве и структуре этого make-файла. Также будет полезно оценить любые знания о том, почему мои флаги, по-видимому, неиспользованы!

Спасибо!

+0

Почему параметр '-c', если вы пытаетесь связать исполняемый файл? –

+0

Почему ваш кланг называется g ++? – SergeyA

+0

@SergeyA, не уверен. Запуск через терминал на Mac с помощью bash. не знаю достаточно о компиляторах, чтобы сказать вам. Что касается -c, то, как мне объяснил мне R Sahu, я верю. – Zroach

ответ

0

В командной строке требуется только -c только при компиляции исходных файлов для создания объектных файлов.

Изменить

main.x: main.o ticker.o list.o 
     $(CC) $(CFLAGS) -c main.o list.o ticker.o 

в

main.x: main.o ticker.o list.o 
     $(CC) $(CFLAGS) -o [email protected] main.o list.o ticker.o 
         ^^^^^ 

[email protected] это имя файла цели правила.

См. GNU make: Automatic Variables для получения таких переменных.

+0

Я все еще получаю ошибку: < br/ > 'g ++ -c main.cpp ticker.cpp list.t clang: warning: list.t: 'linker' input unused g ++ -c list.t clang: warning: list. t: 'linker' input unused g ++ -g -Wall -Wextra -o main.x main.o list.o ticker.o clang: error: нет такого файла или каталога: 'list.o' make: ** * [main.x] Ошибка 1' – Zroach

+0

'list.o' отсутствует. Попробуйте 'make list.o' и посмотрите, что вы получаете. –

+0

'g ++ -c list.t clang: warning: list.t: 'linker' input unused' – Zroach

0

Makefile, должны быть следующие:

CC = g++ 
CPPFLAGS = -g -Wall -Wextra 

default: main.x 

main.x: main.o ticker.o 
    $(CC) -o [email protected] main.o ticker.o 

ticker.o: ticker.cpp 
    $(CC) -c ticker.cpp $(CPPFLAGS) 

main.o: list.t main.cpp 
    $(CC) -c main.cpp $(CPPFLAGS) 

Вы не компилировать файл шаблона. Реализация должна быть внутри того же файла, что и объявление класса (добавление расширения .hpp также будет лучше). Затем шаблон должен быть включен в другие файлы. Например, в основном, поставьте директиву #include "list.t".

+0

Вы правы, так как я, наконец, добрался до того, что файл шаблона не скомпилирован. он правильно форматируется с реализацией и определением в том же файле. Я сделал новый make-файл с кодом, который у вас есть, и получил следующий вывод: 'makefile: 7: *** missing separator. Stop.' – Zroach

+0

Пропущено пространство на этой линии. Я собираюсь отредактировать его. –

+0

А также замените последовательности четырех пробелов на табуляцию, если это не сделано автоматически. –

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