zoukankan      html  css  js  c++  java
  • 链接错误 2001、2019

      今天制作一个关于bullet的模块,在测试工程中正常使用,引入新工程之后一链接失败,偿试了网上能找到的所有方法,均未能成功。期间也想过:因为bullet模块化设计,需要使用宏定义来选择使用哪些模块。在原测试工程中偿试寻找该选择宏,未发现相关宏,因此未继续在此方向上查找原因。但最终在原测试工程中的预编译宏设置中发现bullet工程的选择宏,拷贝到新工程中正常编译、链接成功。

      顺便总结了一下普通情况下的链接错误,可能导致error LNK2001或者LNK2019:

    1、缺少相应的库文件(lib)。一般出现于你使用了第三方提供的库,下载了头文件却忘了载库文件,或库文件忘记放到相应的目录下了。在 链接->输入 填入附加函数依懒。

    2、你自己写的函数声明的头文件也写了函数定义的cpp文件,却依然出现LNK2019错误。

      可能原因:忘记将这两个文件加入工程了。

    3、你自己写的函数声明的头文件,也写了函数定义的cpp文件也加入工程了而且你很确定函数体肯定是在这个库文件中,却依然出现LNK2019错误。

      可能原因:C语言和C++语言混编,因为C++支持函数重载所以C++编译器生成的库文件中的函数名会面目全非,例如C编译器会生成 _readRegmark 这个函数名,而C++编译器则生成了"void __cdecl readRegmark(char *)" (?readRegmark@@YAXPAD@Z)这么个函数名。当你的函数是用C语言写的,VS编译器会按C语言规则编译,但链接器却不知道还傻傻的用C++规则的函数名去找结果就找不到了。解决:在C语言的头文件中加入以下代码

    1 #ifdef __cplusplus
    2 extern "C" {
    3 #endif
    4 
    5 void readRegmark(char *regmark);  //这里写函数声明
    6 
    7 #ifdef __cplusplus
    8 }
    9 #endif

    4、模板声明和实现要放在同一文件夹中。模版函数声明与实现文件要在同一文件夹中。有时候前面函数的声明 与 后面的 函数的定义 时的参数类型不同时,compile能通过,但link会出现LNK2019错误!

    5、内联函数定义在头文件中(一般需要定义在cpp中)。

    6、错误的工程类型等等。

  • 相关阅读:
    Android调用Webserive
    SSD算法思想和结构详解
    第五章-一起看决策树如何做出决策?
    第四章-朴素贝叶斯朴素吗?
    第三章-KNN(分类和回归算法模型)
    第二章-感知机
    第一章-统计学习方法概论
    c语言 宏定义和全局变量,认识循环语句
    运算符注意事项
    c语言的scanf函数注意事项
  • 原文地址:https://www.cnblogs.com/ice-arrow/p/11084520.html
Copyright © 2011-2022 走看看