包含头文件时的C ++ LNK2019

时间:2014-04-12 20:24:36

标签: c++ header-files lnk2019 unresolved-external

我有一个头文件,声明了每个函数的声明:

#ifndef TYPECONVERTER_H_INCLUDED
#define TYPECONVERTER_H_INCLUDED

#include <iostream>
#include <string>
#include <vector>
#include <Windows.h>

using namespace std;

unsigned int letter2number(char input);
char number2letter(unsigned int input);

string chararr2string(char *input);
string char2string(char input);

char string2char(string input);
char *string2chararr(string input);

string int2string(int input);
int string2int(string input);
wstring string2wstring(const std::string& input);

LPSTR string2lpstr(string input);

vector<int> intarr2intvector(int input[]);

int *vectorint2intarr(vector<int> input);

vector<string> strarr2vectorstr(string *input);
string *vectorstr2strarr(vector<string> input);

vector<char> chararr2vectorchar(char *input);
char *chararr2vector(vector<char> input);

string wchar2string(WCHAR wc[260]);


#endif

然后是带有实际功能的.cpp文件:

#include "stdafx.h"

#include <iostream>
#include <string>
#include <vector>
#include <Windows.h>
#include "TypeConverter.h"

using namespace std;

unsigned int letter2number(char input)
{
    if(input >= 'A' && input <= 'Z')
        return input - 64;
    else if(input >= 'a' && input <= 'z')
        return input - 96;
    return 0;
}

char number2letter(unsigned int input)
{
    if(input >= 1 && input <= 26)
        return input + 96;
    return 'a';
}

string chararr2string(char *input)
{
    string ret(input);
    return ret;
}

string char2string(char input)
{
    string ret = "";
    ret += input;
    return ret;
}
char string2char(string input)
{
    return input[0];
}

char *string2chararr(string input)
{
    char *ret=new char[input.size()+1];
    ret[input.size()]=0;

    memcpy(ret,input.c_str(),input.size());

    return ret;
}
string int2string(int input)
{
    return std::to_string(input);
}

int string2int(string input)
{
    try{
        stoi(input);
        return stoi(input);
    }
    catch(std::invalid_argument){
        return 1;
    }

}

wstring string2wstring(const std::string& input)
{
    std::wstring ret = std::wstring(input.begin(), input.end());
    return ret;
}

LPSTR string2lpstr(string input)
{
    return const_cast<char *>(input.c_str());
}

vector<int> intarr2intvector(int input[])
{
    std::vector<int> ret(input, input + sizeof input / sizeof input[0]);
    return ret;
}

int *vectorint2intarr(vector<int> input)
{
    int *ret = &input[0];
    return ret;
}

vector<string> strarr2vectorstr(string *input)
{
    std::vector<string> ret(input, input + sizeof input / sizeof input[0]);
    return ret;
}

string *vectorstr2strarr(vector<string> input)
{
    string *ret = &input[0];
    return ret;
}

vector<char> chararr2vectorchar(char *input)
{
    std::vector<char> ret(input, input + sizeof input / sizeof input[0]);
    return ret;
}

char *chararr2vector(vector<char> input)
{
    char *ret = &input[0];
    return ret;
}

string wchar2string(WCHAR wc[260])
{

    char ch[260];
    char DefChar = ' ';
    WideCharToMultiByte(CP_ACP,0,wc,-1, ch,260,&DefChar, NULL);

    std::string ss(ch);
    return ss;
}

当我使用时:

#include "stdafx.h"
#include <iostream>
#include <string>
#include "TypeConverter.h"

using namespace std;

int main()
{
    cout << int2string(2) << endl;
}

如果在项目中创建了两个文件,它的工作正常。但是,当我尝试通过包含&#34; TypeConverter.h&#34;来尝试在不同的程序中执行相同的操作时。它给了我一个LNK2019&#34;未解决的外部符号&#34;错误。我做错了什么?

1 个答案:

答案 0 :(得分:1)

头文件只是声明函数。您还需要定义它们。链接器错误告诉您它无法找到函数的定义。

编译定义函数的源文件,或者为链接器提供定义它们的目标文件或库。

哪些选项适合您,取决于您希望如何构建程序。但是,我的猜测是包含源文件是最好的方法。这有一个明显的好处,即您的程序将始终与源代码同步。