C++ c++;错误LNK2019:未解析的外部符号.obj

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

首先,我知道有上百篇类似的帖子都有相同的错误,而这一切的原因都是因为给出的错误是毫无用处的

我已经通过谷歌搜索了20多个解决方案,但我仍然无法找出代码中的错误所在,因此我提出了这个问题

以下是错误:

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秒发布了答案…;)