C++ c++;错误LNK2019:未解析的外部符号.obj
首先,我知道有上百篇类似的帖子都有相同的错误,而这一切的原因都是因为给出的错误是毫无用处的 我已经通过谷歌搜索了20多个解决方案,但我仍然无法找出代码中的错误所在,因此我提出了这个问题 以下是错误:C++ c++;错误LNK2019:未解析的外部符号.obj,c++,lnk2019,unresolved-external,.obj,C++,Lnk2019,Unresolved External,.obj,首先,我知道有上百篇类似的帖子都有相同的错误,而这一切的原因都是因为给出的错误是毫无用处的 我已经通过谷歌搜索了20多个解决方案,但我仍然无法找出代码中的错误所在,因此我提出了这个问题 以下是错误: Error 2 error LNK1120: 1 unresolved externals C:\Users\Kevin Cruijssen\Documents\Visual Studio 2013\Projects\ClientOSCPP-trunk\ cpp-and-so-clien
Error 2 error LNK1120: 1 unresolved externals C:\Users\Kevin Cruijssen\Documents\Visual Studio 2013\Projects\ClientOSCPP-trunk\ cpp-and-so-client\ClientOSCPP\Debug\ClientOSCPP.exe ClientOSCPP
Error 1 error LNK2019: unresolved external symbol "private: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall CommandSyncHandler::FileJustRenamed(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?FileJustRenamed@CommandSyncHandler@@AAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V23@@Z) referenced in function "private: void __thiscall CommandSyncHandler::ReadFilesToSync(class Socket *)" (?ReadFilesToSync@CommandSyncHandler@@AAEXPAVSocket@@@Z) C:\Users\Kevin Cruijssen\Documents\Visual Studio 2013\Projects\ClientOSCPP-trunk\ cpp-and-so-client\ClientOSCPP\CommandSyncHandler.obj ClientOSCPP
错误2错误LNK1120:1未解析的外部C:\Users\Kevin Cruijssen\Documents\Visual Studio 2013\Projects\ClientOSCPP trunk\cpp and so client\ClientOSCPP\Debug\ClientOSCPP.exe ClientOSCPP
错误1错误LNK2019:未解析的外部符号“private:class std::basic_string\uu thiscall CommandSyncHandler::filejustnamed(class std::basic_string)”(?FileJustRenamed@CommandSyncHandler@@AAE?AV?$basic_string@DU?$char_traits@D@性病病毒$allocator@D@函数中引用了2@@std@@V23@@Z)“private:void\uu thiscall CommandSyncHandler::ReadFilesToSync(类套接字*)”(?ReadFilesToSync@CommandSyncHandler@@AAEXPAVSocket@@@Z)C:\Users\Kevin Cruijssen\Documents\Visual Studio 2013\Projects\ClientOSCPP trunk\cpp and so client\ClientOSCPP\CommandSyncHandler.obj ClientOSCPP
以下是发生错误的类:
CommandSyncHandler.h:
#pragma once
#include "CommandHandler.h"
class CommandSyncHandler : public CommandHandler
{
private:
CommandSyncHandler(void);
CommandSyncHandler(const char* szCommand);
static CommandSyncHandler m_cSyncHandler;
std::string localFolder, remoteFolder;
std::string FileJustRenamed(std::string filename);
void ReadFilesToSync(Socket* socket);
public:
virtual ~CommandSyncHandler(void);
virtual CommandHandler* Clone() const;
virtual void HandleCommand(Socket* socket, std::vector<std::string>& rvParams);
};
#pragma一次
#包括“CommandHandler.h”
类CommandSyncHandler:公共CommandHandler
{
私人:
CommandSyncHandler(无效);
CommandSyncHandler(const char*szCommand);
静态命令同步处理器m_CSynchHandler;
std::string localFolder,remoteFolder;
std::string filejustnamed(std::string filename);
void ReadFilesToSync(Socket*Socket);
公众:
虚拟~CommandSyncHandler(void);
虚拟命令处理程序*Clone()常量;
虚拟void HandleCommand(Socket*Socket,std::vector和rvParams);
};
CommandSyncHandler.cpp:
#include "stdafx.h"
#include "CommandSyncHandler.h"
#include "Constants.h"
#include "FileReader.h"
#include "FileHandler.h"
#include "CommandFactory.h"
#include <iostream>
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <time.h>
CommandSyncHandler CommandSyncHandler::m_cSyncHandler("SYNC");
CommandSyncHandler::CommandSyncHandler(const char* szCommand) : CommandHandler(szCommand){}
CommandSyncHandler::CommandSyncHandler(void){}
CommandSyncHandler::~CommandSyncHandler(void){}
CommandHandler* CommandSyncHandler::Clone() const{
return new CommandSyncHandler;
}
std::string FileJustRenamed(std::string filename){
std::string result = "";
/*std::string filedir;
const size_t last_slasg_index = filename.rfind(PATH_SEPARATOR);
if (std::string::npos != last_slasg_index)
filedir = filename.substr(0, last_slasg_index);
filedir = SERVER_DIRECTORY + filedir.substr(BASE_DIRECTORY.length());
// First check wether the file is the exact same size
// before continueing to compare the bytes/md5-hashes (which takes longer)
FileReader* reader1;
try{
reader1 = new FileReader(filename.c_str());
}
catch (const char* e){
(void)e;
std::cout << "Cannot open file: " << filename << std::endl;
return result = "";
}
int size1 = reader1->FileSize();
// Loop through all the files in the Server's same Directory
FileHandler fileHandler;
std::vector<std::string> filesInDir;
fileHandler.GetFiles(filedir.c_str(), filesInDir);
for each (std::string curfile in filesInDir) {
bool continueLoop = true;
FileReader* reader2 = NULL;
try{
reader2 = new FileReader(curfile.c_str());
}
catch (const char* e){
(void)e;
std::cout << "Cannot open file: " << filename << std::endl;
continueLoop = false;
}
if (continueLoop){
int size2 = reader2->FileSize();
if (size1 != size2){
result = "";
continueLoop = false;
}
if (continueLoop){
// If the size of both files are the same, we continue to check if they are the exact same file
// We do this by comparing the byte-blocks of the file-buffer
const int BUFFER_SIZE = 1024;
std::ifstream file1(filename.c_str(), std::ios::in | std::ios::binary);
std::ifstream file2(curfile.c_str(), std::ios::in | std::ios::binary);
if (!file1.good() || !file2.good()){
result = "";
continueLoop = false;
}
if (continueLoop){
std::streamsize bytesCount1 = 0;
std::streamsize bytesCount2 = 0;
char* buffer1 = new char[BUFFER_SIZE]();
char* buffer2 = new char[BUFFER_SIZE]();
do {
file1.read(buffer1, BUFFER_SIZE);
file2.read(buffer2, BUFFER_SIZE);
bytesCount1 = file1.gcount();
bytesCount2 = file2.gcount();
if (bytesCount1 != bytesCount2 || std::memcmp(buffer1, buffer2, bytesCount1) != 0)
continueLoop = false;
} while (file1.good() || file2.good());
if (continueLoop)
return curfile;
}
}
}
}*/
return result = "";
}
void CommandSyncHandler::HandleCommand(Socket* socket, std::vector<std::string>& rvParams){
if (rvParams.size() < 3)
throw "Not enough parameters specified";
localFolder = rvParams.at(1);
remoteFolder = rvParams.at(2);
std::string filePath = BASE_DIRECTORY;
filePath.append(localFolder);
rvParams.erase(rvParams.begin() + 1);
std::string command = BuildCommand(rvParams);
socket->writeline(command.c_str());
/*| TODO
struct stat file_stats;
struct tm* clock;
stat(filePath.c_str(), &file_stats);
clock = gmtime(&(file_stats.st_mtime));
mktime(clock);
*/
std::vector<std::string> vFiles;
std::string directory = BASE_DIRECTORY;
directory.append(localFolder);
FileHandler handler;
handler.GetFiles(directory.c_str(), vFiles);
for (std::string file : vFiles){
file.erase(0, BASE_DIRECTORY.size());
//Translate local folder to remote folder to sync
int index = file.find(localFolder);
if (index >= 0){
file.erase(index, localFolder.size());
file.insert(index, remoteFolder);
}
socket->writeline(file.c_str());
}
socket->writeline("");
//std::string file = remoteFolder;
//file.append(PATH_SEPARATOR);
//file.append(ent->d_name);
//socket->writeline(file.c_str());
ReadFilesToSync(socket);
}
void CommandSyncHandler::ReadFilesToSync(Socket* socket){
char* returnFile = new char[MAXPATH + 1];
char* returnLine = new char[MAXREAD + 1];
CommandHandler* handler = CommandFactory::create("PUT");
std::vector<std::string> vFiles;
while (socket->readline(returnFile, MAXPATH) > 0)
vFiles.push_back(std::string(returnFile));
for (std::string remoteFile : vFiles){
std::string file = remoteFile;
//Translate remote folder to local folder to sync
int index = file.find(remoteFolder);
std::vector<std::string> vParams;
// Check wether file is completely different or just renamed
std::string oldFile = FileJustRenamed(file);
if (oldFile != "") {
vParams.push_back(std::string("REN"));
vParams.push_back(oldFile);
vParams.push_back(file);
}
else {
// Replace file
if (index >= 0){
file.erase(index, remoteFolder.size());
file.insert(index, localFolder);
}
vParams.push_back(std::string("PUT"));
vParams.push_back(file);
vParams.push_back(std::string(remoteFile));
}
std::cout << "Sending " << file << std::endl;
handler->HandleCommand(socket, vParams);
// Read feedback from put command
while (socket->readline(returnLine, MAXREAD) > 0)
std::string x = returnLine;//std::cout << returnLine << std::endl;
}
delete handler;
delete[] returnFile;
delete[] returnLine;
throw "Sync completed";
}
#包括“stdafx.h”
#包括“CommandSyncHandler.h”
#包括“Constants.h”
#包括“FileReader.h”
#包括“FileHandler.h”
#包括“CommandFactory.h”
#包括
#包括
#包括
#包括
#包括
CommandSyncHandler CommandSyncHandler::m_csynchHandler(“同步”);
CommandSyncHandler::CommandSyncHandler(const char*szCommand):CommandHandler(szCommand){}
CommandSyncHandler::CommandSyncHandler(无效){}
CommandSyncHandler::~CommandSyncHandler(void){}
CommandHandler*CommandSyncHandler::Clone()常量{
返回新的CommandSyncHandler;
}
std::string文件刚刚重命名(std::string文件名){
std::string result=“”;
/*std::stringfiledir;
const size\t last\u slasg\u index=filename.rfind(路径分隔符);
if(std::string::npos!=last\u slasg\u索引)
filedir=filename.substr(0,最后一个slasg\u索引);
filedir=SERVER_DIRECTORY+filedir.substr(BASE_DIRECTORY.length());
//首先检查文件大小是否完全相同
//在继续比较字节/md5哈希之前(需要更长时间)
文件阅读器*reader1;
试一试{
reader1=新文件阅读器(filename.c_str());
}
捕获(常量字符*e){
(e)无效;
std::cout在“CommandSyncHandler.cpp”中,在函数的定义中,将类名CommandSyncHandler
前置到函数名,如下所示:
std::string CommandSyncHandler::filejustrename(std::string filename){
在“CommandSyncHandler.cpp”中,在函数的定义中filejustrename()
将类名CommandSyncHandler
前置到函数名,如下所示:
std::string CommandSyncHandler::filejustrename(std::string filename){
您忘记在cpp文件中的函数名filejustrename
之前添加类名CommandSyncHandler
在cpp文件中尝试以下操作:
std::string CommandSyncHandler::FileJustRenamed(std::string filename){
编辑:哦,@Gil Elad在我之前12秒发布了答案…;)你忘了在cpp文件中的函数名之前添加类名CommandSyncHandler
在cpp文件中尝试以下操作:
std::string CommandSyncHandler::FileJustRenamed(std::string filename){
编辑:哦,@Gil Elad在我前面12秒发布了答案…;)