编译多个文件的问题

时间:2015-12-05 23:05:45

标签: c++ c++11 gcc

所以我尝试编写一些代码来处理数独游戏,我在编译时遇到错误,每次编译都会删除驱动程序。

下面是驱动程序的代码:

/*
 * 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

最后是Sudoku 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文件就好了,但是当我打电话给&#39; gcc -o Driver.cpp时,SudokuBoard.o&#39;我得到了一大堆错误信息,下面是一个样本:

/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任何想法我做错了什么?

4 个答案:

答案 0 :(得分:4)

您的命令行不正确:

>>> df.groupby('Hour').count()['Vge']
Hour
0     2
2     2
5     1
8     1
12    2
Name: Vge, dtype: int64

指示gcc -o Driver.cpp SudokuBoard.o 将目标文件SudokuBoard.o链接为名为gcc的可执行文件。毫不奇怪,它首先擦除了目标文件。

此外,您没有指定要链接的运行时库,Driver.cpp不默认为C ++:这解释了错误消息。

你应该写:

gcc

答案 1 :(得分:2)

使用g++编译C ++代码,而不是常见的面向C的gcc

g++调用gcc进行编译并使用正确的C ++选项进行链接。

简而言之,对C ++源代码使用C ++编译器,对Fortran源代码使用Fortran编译器等等是个好主意。

此外,对于“并删除Driver.cpp”的问题,只需不要将该源文件指定为输出文件。

答案 2 :(得分: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++

答案 3 :(得分:0)

问题是带有gcc的-o选项用于指定输出文件。如果你写

gcc -o Driver.cpp SudokuBoard.o

告诉编译器从目标文件SudokuBoard.o中创建一个名为Driver.cpp的可执行文件。但是由于SudokuBoard.o没有main方法,这将失败,因此错误消息。 尝试

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

代替。