关于VS中LNK1120与errorLNK2019问题

      最近遇到了该问题,再查找了一些资料后,发现了针对自己问题的解决方法,贴出来让大家一起学习一下。

  其实如果这两个问题同时出现,很可能不是链接库缺了lib,而是编译中添加的源没有被实例化,造成编译时,机器以为是缺失lib。本人用的编译器为vs2012,问题出在与,在.h声明了函数后,在.hpp下进行了定义。问题在于.hpp不是其源文件。所以最后生成LNK错误。以前自己移动过,再次添加源文件没注意,造成了.hpp没有被认为是源文件而是头文件。

   下面是我看到的一个例子,分享一下。

摘自[1].http://q.cnblogs.com/q/34032/

  我在一个头文件里定义了声明了一个模版函数,如下:

//Combination.h
#ifndef VECTOR_H
#define VECTOR_H

#include <vector>

#endif

template<class T> void Combination(T a[], int len, int index, int m, std::vector<T>& c);
CPP里定义

//Combination.cpp
#include "Combination.h"

using namespace std; 

template<class T> void Combination(T a[], int len, int index, int m, vector<T>& c)
{
    if(0 == m)
    {
        vector<T>::iterator iter = c.begin();
        for(; iter != c.end(); ++iter)
        {
            cout<<*iter;
        }
        printf("\n");
        return;
    }

    if(len == index)
        return;

    c.push_back(a[index]);
    Combination(a, len, index + 1, m - 1, c);
    c.pop_back();

    Combination(a, len, index + 1, m, c); 
}

main中调用

#include <iostream>
#include "Combination.h"

#ifndef VECTOR_H
#define VECTOR_H

#include <vector>

#endif

using namespace std;

void main()
{
    int a[] = {1,2,3,4,5,6};
    
    vector<int> c;
    Combination(a, sizeof(a) / sizeof(int), 0, 3, c);
        
    system("pause");
    return;
}

编译连接时提示以下错误

错误 1 error LNK2019: 无法解析的外部符号 "void __cdecl Combination<int>(int * const,int,int,int,class std::vector<int,class std::allocator<int> > &)" (??$Combination@H@@YAXQAHHHHAAV?$vector@HV?$allocator@H@std@@@std@@@Z),该符号在函数 _main 中被引用 main.obj CppTest
错误 2 fatal error LNK1120: 1 个无法解析的外部命令 D:\Documents\Visual Studio 2008\Projects\CppTest\Debug\CppTest.exe CppTest

解决方法:

   把方法或类定义放到声明的.h文件中去。

      理解这个问题,需要一点编译原理的知识,在调用一个方法或者使用一个类的时候,本cpp作为一个独立的编译单元,可能并不知道某一个方法或者类型的符号是怎么样的,但是这时候不会出错,还是可以针对每个编译单元生成目标文件obj,之后针对没有找到的方法或者类型符号,链接器会在别的obj文件中寻找缺失的符号。

   假设模版函数可以放在头文件中声明,CPP中定义,按照你的例子分析一下:
main中调用Combination(a, sizeof(a) / sizeof(int), 0, 3, c);,也就是类型Combination(int, int,int,int, vector<int>&);但是编译器并不知道Combination(int, int,int,int, vector<int>&);,因为这个类型并不在任何一个.h文件中,之后编译器会寄希望于链接器可以解决这个问题,也就是在Combination.cpp的编译目标文件Combination.obj中,但是Combination.obj也没有这个类型,它有的只是一个模板定义。
 
 
C++标准里规定: 当一个模板不被用到的时侯它就不该被实例化出来,Combination.cpp没有用到Combination(int, int,int,int, vector<int>&);,所以也就不会编译出来该符号,链接出错也就可以理解了。



  

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
LNK2019错误是一个链接错误,指示在编译时找不到外部符号的定义或解析。这个错误通常发生在链接器无法解析函数、变量或对象的引用时。在你提供的引用LNK2019错误的消息显示无法解析外部符号“_lws_create_context@4”,该符号在“WebsocketServerApp::startServer”函数被引用。 该错误通常是由以下几种情况引起的: 1. 缺少对相关函数或变量的定义或声明。 2. 函数或变量的声明与其定义不匹配。 3. 编译器没有找到相关的库文件或链接器没有将库文件添加到项目。 要解决这个问题,可以尝试以下几个步骤: 1. 确保你的代码包含了正确的函数或变量声明,以及它们的定义。 2. 检查函数或变量的声明和定义是否匹配,包括参数类型和返回类型。 3. 确保你的项目包含了相关的库文件,并将它们添加到链接器的输入选项。 通过检查这些方面,你应该能够解决LNK2019错误并成功编译你的代码。<span class="em">1</span> #### 引用[.reference_title] - *1* [VS报错 --- error LNK2019: 无法解析的外部符号](https://blog.csdn.net/bigger_belief/article/details/131241862)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾城一少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值