所以我尝试编写一些代码来处理数独游戏,我在编译时遇到错误,每次编译都会删除驱动程序。
下面是驱动程序的代码:
/*
* 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任何想法我做错了什么?
答案 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
代替。