我想弄清楚如何制作一个由不同文件组成的程序。我读过这篇文章:
Function Implementation in Separate File
但没有成功。我有3个文件:main.cpp,func.cpp,time.h,当我编译时,我收到此错误消息:
duplicate symbol getOpen(std::basic_ofstream<char, std::char_traits<char> >&)in:
/var/folders/kp/57zkm0tn1q7b7w0cs7tlf98c0000gn/T//cczaW1Px.o
/var/folders/kp/57zkm0tn1q7b7w0cs7tlf98c0000gn/T//ccvOCRgc.o
ld: 1 duplicate symbol for architecture x86_64
collect2: ld returned 1 exit status
我不知道这意味着什么。我基本上只是试图打开一个文件,写入它并关闭它。我还创建了一个对象并对其进行了测试。我知道问题来自func.cpp,因为当我删除它时它会起作用。有人可以建议吗?谢谢。
我输入这个来编译:{{1}}。
这是我的代码:
g++ main.cpp func.cpp
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <fstream>
using namespace std;
class Time
{
private:
int seconds;
int minutes;
int hours;
public:
Time(int=0, int=0, int=0);
Time(long);
void showTime();
};
Time::Time(int sec, int min, int hour)
{
seconds = sec;
minutes = min;
hours = hour;
}
Time::Time(long sec)
{
hours = int(sec / 3600);
minutes = int((sec % 3600)/60);
seconds = int( (sec%60) );
}
void Time::showTime()
{
cout << setfill('0')
<< setw(2) << hours << ':'
<< setw(2) << minutes << ':'
<< setw(2) << seconds << endl;
}
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int getOpen(ofstream& fileOut)
{
string filename = "outfile.txt";
fileOut.open(filename.c_str());
if( fileOut.fail())
{
cout << "\nFailed to open file.\n";
exit(1);
}
else
return 0;
}
答案 0 :(得分:1)
您不应#include "func.cpp"
加入main.cpp
。
嗯,这取决于你编译程序的方式。如果只编译main.cpp,那么应该包含func.cpp。但这不是编写程序的好方法,我希望你不会这样做。
您可能想要做的是分别编译main.cpp和func.cpp(使用gcc -c
),然后链接.o
文件。如果您不将一个.cpp文件包含在另一个文件中,那将完全没问题。但是当你将func.cpp包含到main.cpp中时,两个.o
文件都定义了getOpen
函数。这会导致错误。
所以:只需删除main中的#include。
答案 1 :(得分:1)
您已将"func.cpp"
添加到main.cpp
,因此您有getOpen
的双重声明。