2015-12-05 25 views
1

Итак, я пытаюсь написать немного кода для работы с головоломками sudoku, и я продолжаю получать ошибки при попытке скомпилировать, и каждый раз, когда я его компилирую, он удаляет драйвер.Проблемы с компиляцией нескольких файлов

Heres код для водителя:

/* 
* Jared C 
* C++ Project 
*/ 
#include <iostream> 
#include "SudokuBoard.h" 

using namespace std; 

int main() 
{ 
    SudokuBoard board("sudoku.txt"); 
    board.printBoard(); 
} 

А вот файл заголовка

/* 
* Jared C 
* SudokuBoard.h 
*/ 

#ifndef __SUDOKUBOARD_H_INCLUDED__ 
#define __SUDOKUBOARD_H_INCLUDED__ 

#include <iostream> 
#include <string> 

class SudokuBoard 
{ 
    private: 
    int content[9][9]; 

    public: 
    SudokuBoard(std::string filename); 
    void printBoard(); 
    int getNumAt(int, int); 
    void setNumAt(int, int, int); 
}; 

#endif 

И, наконец, судоку Board.cpp

/* 
* Jared C 
* SudokuBoard.cpp 
*/ 

#include <iostream> 
#include <fstream> 
#include "stdlib.h" 
#include "SudokuBoard.h" 


using namespace std; 

SudokuBoard::SudokuBoard(string filename) 
{ 
    string output; 
    string line; 
    int count = 0; 
    ifstream file; 
    file.open(filename.c_str()); 
    if (file.is_open()) 
    { 
     while (getline (file, line)) 
     { 
      output += line; 
     } 
     file.close(); 
    } 
    else cout<< "unable to open file" << endl; 
    for(int y = 0; y < 9; y++) 
    { 
     for(int x = 0; x < 9; x++) 
     { 
      content[x][y] = atoi(output.substr(count,1).c_str()); 
      count ++; 
     } 
    } 
} 

void SudokuBoard::printBoard() 
{ 
    string output = "\n"; 

    for(int y = 0; y < 9; y++) 
    { 
     if(y%3==0) 
     { 
      output += '\n'; 
     } 
     for(int x = 0; x < 9; x++) 
     { 
      if(x%3==0) 
      { 
       output += " "; 
      } 
      output += content[x][y]; 
      output += "\n"; 
     } 
    } 
    cout<<output<<endl; 
} 

int SudokuBoard::getNumAt(int x, int y) 
{ 
    return content[x][y]; 
} 

void SudokuBoard::setNumAt(int x, int y, int value) 
{ 
    content[x][y] = value; 
} 

Когда я называю gcc -c SudokuBoard.cpp я получаю файл SudokuBoard.o просто отлично, но когда я тогда называю «gcc -o Driver.cpp SudokuBoard.o», я получаю огромная стена сообщений об ошибках, Heres образец из них:

/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11 


SudokuBoard.cpp:(.text+0x34): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()' 
SudokuBoard.cpp:(.text+0x43): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()' 

И удаляет Driver.cpp Любая идея, что я делаю не так?

+0

Re '__SUDOKUBOARD_H_INCLUDED__', идентификаторы с двумя последовательными символами подчеркивания зарезервированы для реализации, поэтому это формальный UB. –

+0

Почему бы не выбрать ответ, который * решает вашу проблему * в качестве решения? не очень приятно читателям выбирать тот, который не работает. это похоже на активное неправильное направление. есть два ответа, которые работают. я предлагаю вам выбрать один из них. –

+0

Решение, которое я выбрал как правильно, отлично сработало для меня, поэтому я выбрал его. – JCan

ответ

0

Проблема заключается в том, что опция -o с GCC используется для указания выходного файла. Если вы пишете

gcc -o Driver.cpp SudokuBoard.o 

компилятору создать исполняемый файл с именем Driver.cpp из объектного файла SudokuBoard.o. Но поскольку у SudokuBoard.o нет основного метода, это приведет к сбою, поэтому сообщения об ошибках. ИСПАНИЯ

gcc -c SudokuBoard.cpp 
gcc -c Driver.cpp 
gcc -o Sudoku SudokuBoard.o Driver.o 

вместо этого.

+0

Последняя строка должна быть 'gcc -o sudoku Sudokuboard.o Driver.o' право? И вы обычно хотите использовать 'g ++', а не 'gcc' для кода на C++. – harald

+0

@harald: Да, вы правы, я сам забыл выходной файл. Только что отредактировал мой ответ; должно быть правильно. – Xaver

+1

Это не относится к проблеме связывания ошибок, только «И удаляет Driver.cpp». Это хорошая идея ** попробовать ** ваше решение, прежде чем публиковать его. –

0

Компилятор говорит вам, что не может найти реализацию для std::basic_string<...>.

Вы должны сообщить компилятору, как найти скомпилированный код для std::basic_string<...>. Многое, как с вашим собственным кодом, если вы попытались создать исполняемый файл только из Driver.cpp, компилятор будет жаловаться на отсутствие ссылок SudokuBoard, пока вы не сообщите об этом SudokuBoard.o.

В этом случае вам нужно сообщить компилятору о стандартной библиотеке C++. Эта библиотека обычно поставляется с вашим дистрибутивом. В Windows в виде файлов dll, на OS X dylib файлах и в Linux so файлах. Концептуально они похожи, много мешков .o файлов все вместе. В любом случае вы указываете компоновщику ссылку на стандартную библиотеку C++.

gcc вызывает стандартную библиотеку C++ libstdc++, поэтому ваша команда будет примерно такой: gcc -o Driver Driver.cpp SudokuBoard.o -lstdc++.

+0

Вместо «что-то вроде», почему вы не просто посоветовали использовать g ++? –

2

Использовать g++ для компиляции кода на C++, а не для общего C-ориентированного gcc.

g++ вызывает gcc для компиляции и ссылки на подходящие варианты для C++.

Короче говоря, рекомендуется использовать компилятор C++ для исходного кода C++, компилятор Fortran для исходного кода Fortran и т. Д.


Кроме того, для выпуска “ И он удаляет Driver.cpp ”, просто не указать, что исходный файл в качестве выходного файла.

+1

На анонимном необъяснимом нисходящем (или, возможно, будущем подобном downvotes) на этом ответе они являются мести downvotes. От одного или нескольких других респондентов по этому вопросу. Слишком уж большая некомпетентность на SO сейчас. –

+0

На самом деле нет. Downvote из-за того, что ваш пост имеет ту же проблему, за которую вы забрасываете других. Другими словами, вы держите других членов в стандарте, к которому вы не держите себя. – Peter

+0

@Peter: вам нужно ** попробовать ** ваши предложенные команды. они воспроизводят стену ошибок. этот ответ, OTOH, верен. И так ответ chqrlie. Ответ Тима только что был исправлен, но это не так полно, как это и ответ chqrlie. –

4

Ваша командная строка неверна:

gcc -o Driver.cpp SudokuBoard.o 

Инструктирует gcc связать объектный файл SudokuBoard.o как исполняемый файл с именем Driver.cpp. Не удивительно, что он сначала удаляет файл назначения.

Кроме того, вы не указываете библиотеку времени выполнения для связи, а gcc не имеет значения по умолчанию для C++: это объясняет сообщение об ошибке.

Вы должны вместо этого написать:

g++ -o Sudoku Driver.o SudokuBoard.o