2017-12-17 3 views
-1

Ich verwende DEVC++ 5.11 und ich habe ein Projekt mit 5 Dateien:Fehler - ld returned 1 Exit-Status undefiniert Bezug auf

mainDistances.cpp

distances.cpp

distances.h

matrix.cpp

matrix.h

Ich bekomme diese Fehler:

[Error] ld returned 1 exit status 
mainDistances.cpp: undefined reference to `Matrix<float>::operator=(Matrix<float> const&)' 
mainDistances.cpp:(.text+0xb5f): undefined reference to `Matrix<float>::rows()' 
[...]\distances.o distances.cpp:(.rdata$_ZTV6MatrixIiE[_ZTV6MatrixIiE]+0x18): undefined reference to `Matrix<int>::readMatrix(std::string const&)' 

AND MORE 

Fast alles sieht undefiniert aus. Es ist so, als würde es die anderen Dateien nicht lesen.

# Project: mainDistances 
# Makefile created by Dev-C++ 5.11 

CPP  = g++.exe 
CC  = gcc.exe 
WINDRES = windres.exe 
OBJ  = distances.o mainDistances.o matrix.o 
LINKOBJ = distances.o mainDistances.o matrix.o 
LIBS  = -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc 
INCS  = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" 
CXXINCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++" 
BIN  = mainDistances.exe 
CXXFLAGS = $(CXXINCS) -std=c++11 
CFLAGS = $(INCS) -std=c++11 
RM  = rm.exe -f 

.PHONY: all all-before all-after clean clean-custom 

all: all-before $(BIN) all-after 

clean: clean-custom 
    ${RM} $(OBJ) $(BIN) 

$(BIN): $(OBJ) 
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) 

distances.o: distances.cpp 
    $(CPP) -c distances.cpp -o distances.o $(CXXFLAGS) 

mainDistances.o: mainDistances.cpp 
    $(CPP) -c mainDistances.cpp -o mainDistances.o $(CXXFLAGS) 

matrix.o: matrix.cpp 
    $(CPP) -c matrix.cpp -o matrix.o $(CXXFLAGS) 

Die Dateien bekam fast 200 Zeilen jeder so werde ich nicht diesen Beitrag riesig, aber bitte sagen Sie mir, wenn Sie einige andere Code-Teile benötigen.

distances.h

#ifndef DISTANCES_H 
#define DISTANCES_H 

#include "matrix.h" 

template<class T> 
class Distances : public Matrix<T> { 

public: 

    using Matrix<T>::matr_; 
    using Matrix<T>::mRows; 
    using Matrix<T>::mCols; 
    using Matrix<T>::operator+; 
    using Matrix<T>::operator+=; 
    using Matrix<T>::operator=; 

    Distances(size_t first, size_t second) : Matrix<T>(first, second) {}; 
    Distances(size_t first, size_t second, T value) : Matrix<T>(first, second, value) {}; 

    //Costruttore senza parametri. Vengono utilizzati quelli di Matrix 
    Distances(void) : Matrix<T>() {}; 

    //Costruttori che permettono il confronto 
    static bool equal(const Distances<T>& , const Distances<T>&); 
    bool operator == (const Distances<T>& rsh) const; 

    //Costruttori di lettura, scrittira e stampa della Matrice 
    void readMatrix (const std::string &filename = "distIn.txt"); 
    void writeMatrix(const std::string &filename = "distOut.txt"); 
    void print(const std::string s); 

    //Ridefinizione dell'operatore * 
    virtual Distances<T>& operator*(const Distances<T>&); 

    //Costruttori delle funzioni che risolvono il minPath 
    static Distances<T> minPathFunct(const Distances<T>&, int y); 
    static Distances<T> minPathFW(const Distances<T>& , int y); 

}; 

#endif 

distaces.cpp

#include "distances.h" 


/** Funzione che ci permette di leggere la Matrice del file **/ 
template <class T> 
void Distances<T>::readMatrix(const std::string &filename) { 

    std::ifstream file; 
    file.open(filename, std::ios::in); //Apriamo il file 

    //Controlliamo la presenza del file 
    if(!file.is_open()) { 
     std::cout << "Could not open file " << filename << std::endl; 
     return; 
    } 

    //Dichiariamo le variabili utili per l'estrazione dei valori della Matrice 
    std::string line, str; 
    T value; 
    int rows = 0; 

    //Ciclo while che ci permette di estrarre i valori matriciali dalle n-righe 
    while(std::getline(file, line)) { 

     std::istringstream iss(line); 
     rows++; 
     int cols = 0; 

     //Ciclo while che estrae ogni valore di una riga 
     while(iss >> str) { 
     cols++; 
     if (str=="*") value = std::numeric_limits<T>::max(); 
     else value = stof(str); 
     matr_.push_back(value); 
     } 

     mCols = cols; 

    } 

    mRows = rows; 

} 


/** Funzione di scrittura della Matrice ottenuta in un file di testo **/ 
template <class T> 
void Distances<T>::writeMatrix(const std::string &filename) { 

    //Apertura del file 
    std::ofstream file; 
    file.open(filename, std::ios::out); 

    if(!file.is_open()) { 
     std::cout << "Could not open file " << filename << std::endl; 
     return; 
    } 

    T value; 
    std::string str; 

    //Cicli for che ci permettono il salvataggio del valore M[i][j] nel file testo 
    for (int i=0;i<mRows;i++) { 
     for(int j=0;j<mCols;j++) { 
     value = matr_[i*mRows + j]; 
     str =std::to_string(value); 
     if (value == std::numeric_limits<T>::max()) str = "*"; 
     file << std::setw(7) << str << " "; 
     } 
     file << endl; 
    } 

    //Chiusura del file 
    file << endl; 
    file.close(); 

} 

[...] 

template class Distances<int>; 
template class Distances<float>; 
+0

Mögliche Duplikate von [Warum können Vorlagen nur in der Header-Datei implementiert werden?] (Https://stackoverflow.com/questions/495021/why-can-templates-only-in-the-header-file implementiert) – user0042

+0

@ user0042 Ich verstehe nicht, wie es das Problem löst – lory2l

+0

Sie haben Ihre Template-Klassendefinitionen offensichtlich in einer separaten Übersetzungseinheit implementiert. Wenn Sie sich nicht auf alle verwendeten Template-Parameter-Typen spezialisieren, wird sich der Linker über die fehlenden Definitionen beschweren. – user0042

Antwort

-1

Ihre Codes vielleicht die math.h genannt, becusse C++ Standard genannt libc.so (es müssen nicht hinzufügen -lc Parameter) .wenn Sie das math.h aufgerufen haben, müssen Sie "-lm" hinzufügen, um libm.so hinzuzufügen. Ich hoffe, es kann Ihnen helfen. Mein Englisch ist sehr schlecht, es tut mir leid ...

Verwandte Themen