C ++:为什么我会收到链接器错误?

时间:2013-03-29 03:31:51

标签: c++ .net linker lnk

请注意,我正在使用带有.NET的Windows窗体应用程序

这是我的代码:

#pragma once
#include <cstdlib>
#include <Windows.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <stdio.h>
#include <string>
#include <cstring>
#include <iostream>
#include <vcclr.h>
#include <hashlibpp.h>

namespace Launcher {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace System::Diagnostics;
    using namespace MySql::Data::MySqlClient;
    using namespace std;
    using namespace System::Runtime::InteropServices;




    /// <summary>
    /// Summary for Form1
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();


            //
            //TODO: Add the constructor code here
            //
        }

    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }

    //Component properties (not important)

        }
#pragma endregion

void convert(String^ total1, char    *ch){ //Converts string to const char*
    // Pin memory so GC can't move it while native function is called
   pin_ptr<const wchar_t> c1 = PtrToStringChars(total1);
   printf_s("%S\n", c1);

   // Conversion to char* :
   // Can just convert wchar_t* to char* using one of the 
   // conversion functions such as: 
   // WideCharToMultiByte()
   // wcstombs_s()
   // ... etc
   size_t convertedChars = 0;
   size_t  sizeInBytes = ((total1->Length + 1) * 2);
   errno_t err = 0;
   ch = (char *)malloc(sizeInBytes);

   err = wcstombs_s(&convertedChars, 
                    ch, sizeInBytes,
                    c1, sizeInBytes);
   if (err != 0)
      printf_s("wcstombs_s  failed!\n");

    printf_s("%s\n", ch);
}

void MarshalString ( String ^ s, string& os ) { //Another converter 
   using namespace Runtime::InteropServices;
   const char* chars = 
      (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
   os = chars;
   Marshal::FreeHGlobal(IntPtr((void*)chars));
}

void MarshalString ( String ^ s, wstring& os ) { //Another converter
   using namespace Runtime::InteropServices;
   const wchar_t* chars = 
      (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer();
   os = chars;
   Marshal::FreeHGlobal(IntPtr((void*)chars));
}

    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
             }
             //I removed some other functions from here because they are blank
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                    //MySQL variables
                 try{
                     conDataBase->Open();
                     myReader=cmdDataBase->ExecuteReader();
                     while(myReader->Read()){
                     String^ atmp_user = textBox1->Text;
                     String^ user = (myReader->GetString(1));//Gets Usernames from database
                     String^ atmp_pass = textBox2->Text;
                     String^ pass = (myReader->GetString(2));//Gets Passwords from database
                     atmp_pass->ToLower();//Lower Case's variable
                     atmp_user->ToLower();
                     String^ total1 = gcnew String(atmp_user+atmp_pass);//Combines 2 strings

                     string totala;//std::string

                     MarshalString(total1, totala);//Copies data from (total1) to (totala)

                     hashwrapper *myWrapper = new sha1wrapper();//SHA1 hashing begins

                     string hash1 = myWrapper->getHashFromString(totala);//creates new variable(hash1) and copies data from (totala)

                     String^ finalpass;//Creates new System::String
                     MarshalString(finalpass, hash1);//Copies data from (hash1) to (finalpass)
 delete myWrapper;//Ends SHA1 hashing
                                //Login Script
                     if(atmp_user == user && finalpass == pass){
                         textBox1->Text = ("It worked!");
                     }
                     }
                 } catch(Exception^ex) {
                     MessageBox::Show(ex->Message);
                 }
         }
    //Other blank functions created
};
}

以下是错误:

Error   4   error LNK2028: unresolved token (0A0000D5) "public: __clrcall md5wrapper::md5wrapper(void)" (??0md5wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z)  C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   3   error LNK2028: unresolved token (0A00009D) "public: __clrcall sha384wrapper::sha384wrapper(void)" (??0sha384wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z) C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   2   error LNK2028: unresolved token (0A000094) "public: __clrcall sha512wrapper::sha512wrapper(void)" (??0sha512wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z) C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   1   error LNK2028: unresolved token (0A00005B) "public: __clrcall sha256wrapper::sha256wrapper(void)" (??0sha256wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z) C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   5   error LNK2019: unresolved external symbol "public: __clrcall sha512wrapper::sha512wrapper(void)" (??0sha512wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z)  C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   6   error LNK2019: unresolved external symbol "public: __clrcall sha384wrapper::sha384wrapper(void)" (??0sha384wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z)  C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   7   error LNK2019: unresolved external symbol "public: __clrcall sha256wrapper::sha256wrapper(void)" (??0sha256wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z)  C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   8   error LNK2019: unresolved external symbol "public: __clrcall md5wrapper::md5wrapper(void)" (??0md5wrapper@@$$FQAM@XZ) referenced in function "public: class hashwrapper * __clrcall wrapperfactory::create(enum HL_Wrappertype)" (?create@wrapperfactory@@$$FQAMPAVhashwrapper@@W4HL_Wrappertype@@@Z)   C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Launcher\hl_wrapperfactory.obj
Error   9   error LNK1120: 8 unresolved externals   C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\Launcher\Debug\Launcher.exe   1

我不明白这些,所以我希望你们能。顺便说一下,我在这个项目中使用hashlib ++库进行SHA1散列。我假设这就是为什么有这么多的引用。

2 个答案:

答案 0 :(得分:0)

您需要链接图书馆本身。在visual studio中,转到项目首选项,链接器选项,然后选择您正在使用的实际库。 Here您可以找到一个关于如何完成屏幕截图的示例。

答案 1 :(得分:0)

这是我遇到的一个奇怪的错误。出于某种原因,VC ++将方法视为具有__clrcall调用约定,即使它们属于非托管类。我不确定触发它的是什么,它不会在大多数时间发生。

如果所有其他方法都失败了,请尝试使用__thiscall调用约定(这是非托管方法的默认值)显式标记非托管类(包括构造函数和析构函数)的方法:

class md5wrapper
{
public:
    __thiscall md5wrapper();
    __thiscall ~md5wrapper();

    void __thiscall SomeMethod();

    ...