在windows C++编程中,error LNK2019: 无法解析的外部符号三种情况

第一种就是没有引入相应的lib库,这个情况是最常见的。

对于lib库是要链接到exe程序中的,找不到函数对应的符号xxx.lib,那就会报error LNK2019: 无法解析的外部符号,有的时候还会提示在什么地方调用了,例如:error LNK2019: 无法解析的外部符号 _xxx,该符号在函数 _???中被引用。

遇到这种情况,只需要将相应的lib加入到工程中编译就可以了。VS工具是在属性配置连接器。

第二种情况是同类文件不唯一存在。

在一个解决方案中有多个子工程,而多个工程中有同类的头文件、或某些方法函数在多个引用类中同时存在,当把同类同名整合到一个工程交叉引用再编译的时候,就有可能引用了不是它自己的文件,比如:project/demo1/include和project/demo2/include,在这两个目录下都有error.h,然后在附件包含目录中交叉引用。这样在链接编译时候,就存在不确定性。可能会出现,demo2引用demo1的error.h的可能。

这个情况解决方法是更改相同的文件名字为每个子工程自己的,让文件名在一个项目中尽量唯一。

 第三种情况是跨工程应用文件而未附加到本工程目录。

一个工程目录如project/test/test.vcproj,而引用函数的实现目录在project/test1/file.cpp,这种情况下也会报error LNK2019: 无法解析的外部符号。

这个情况的解决方法是,将project/test1目录放到附件包含目录中。

### 关于驱动开发中的 LNK2019 错误 在驱动程序开发过程中遇到 `LNK2019` 错误通常是因为链接器无法解析某些外部符号。具体到此案例中,错误提示表明未解析外部符号为 `__imp____stdio_common_vsscanf` 和 `__stdio_common_vsprintf`,这些函数与标准库中的输入/输出操作有关。 #### 原因分析 此类问题的主要原因可能包括以下几个方面: - 缺少必要的运行时库支持文件[^1]。 - 使用的标准 C 库版本不兼容当前编译环境或目标平台的要求。 - 配置选项设置不当,例如缺少特定的链接标志或者选择了错误的目标架构。 #### 解决方法 以下是几种常见的解决方案: ##### 方法一:更新工具链和 SDK 版本 确保使用的 Microsoft Visual Studio 或其他构建工具是最新的,并安装最新版 Windows Driver Kit (WDK)。旧版本可能存在缺失的功能实现,升级可以提供更全面的支持。 ##### 方法二:调整项目属性配置 检查项目的 **C/C++ -> Code Generation** 设置项下的 “Runtime Library”,将其改为 `/MTd`(多线程调试静态链接)或其他适合的形式来匹配所需的 CRT 实现方式。另外,在 Linker 的 Input 属性页里确认已加入所有必需的依赖 DLL 导入库名称列表。 ##### 方法三:手动定义替代宏 如果确实需要保留现有编译参数而又不想更改全局设定,则可以通过预处理器指令重新定向调用路径至自定义实现代替品上。下面展示了一个简单的例子用于替换掉有问题的部分功能: ```c #include <stdarg.h> #include <string.h> // 自己编写一个简易版的 vsnprintf 函数作为备选方案 int my_vsnprintf(char *str, size_t size, const char *format, va_list ap) { int result; if (!size) return 0; // 如果缓冲区大小为零则返回成功但不做任何事情 result = _vscprintf(format, ap); // 获取所需最小空间长度 if(result >= (int)size){ memset(str,'\0',sizeof(*str)*size); return -1;// 表明溢出了给定的空间范围 } vsprintf_s(str,size, format,ap ); str[size -1]='\0';// 确保字符串结尾正确标记结束符 return strlen(str); } #define vsnprintf my_vsnprintf ``` 通过上述代码片段,我们创建了自己的 `my_vsnprintf()` 来规避原始接口带来的麻烦。注意这里仅作为一个临时措施演示用途,请依据实际需求评估其适用性和安全性后再决定是否采用这种方法。 --- ### 总结 针对 `LNK2019` 类型的问题,建议优先考虑同步最新的软件包资源以及合理安排工程选项;当常规手段难以奏效时再尝试局部修正策略如重写部分核心逻辑等。务必保持警惕避免引入额外风险因素影响整体稳定性表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值