084-关于vs无法解析的外部符号bug

本文探讨了在使用Visual Studio 2017进行C++项目开发时遇到的跨编译问题,具体表现为链接器错误LNK2019和LNK1120,即无法解析的外部符号错误。通过将main.cpp更改为main.c,问题得以解决。文章深入分析了C和C++在编译和链接过程中的差异,并提供了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类似这样的一个例子,三个文件:
1、add.h

#ifndef HELLO_H
#define HELLO_H

#include <stdio.h>
#include <stdlib.h>

int get(int a, int b);

#endif

2、add.c

#include "add.h"

int get(int a, int b)
{
	return a + b;
}

3、main.cpp

#include "add.h"

int main()
{
	int a = 3, b = 4;
	int c = get(a, b);
	printf("%d + %d = %d\n", a, b, c);
	system("pause");
	return 0;

}

碰见这样一个错误:

1>------ 已启动生成: 项目: ConsoleApplication1, 配置: Debug Win32 ------
1>main.cpp
1>main.obj : error LNK2019: 无法解析的外部符号 "int __cdecl get(int,int)" (?get@@YAHHH@Z),该符号在函数 _main 中被引用
1>F:\vs2017\ConsoleApplication1\Debug\ConsoleApplication1.exe : fatal error LNK1120: 1 个无法解析的外部命令
1>已完成生成项目“ConsoleApplication1.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

眼神好的朋友可能已经发现了,就是因为main.cpp,改为main.c就ok。

### 无法解析外部符号 `sbstropcorr` 的原因分析 当遇到链接错误提示“无法解析外部符号 `sbstropcorr`”,这意味着编译器能够找到该符号的声明,但是在链接阶段未能定位到其定义。此类问题可能源于多个方面: - 编译选项、库文件路径以及链接器设置不当可能导致此现象发生[^1]。 - 如果涉及第三方库,则需确认这些库已正确定义并成功引入项目中[^4]。 ### 解决方案概述 #### 验证函数实现的存在性和正确性 确保目标函数 `sbstropcorr` 已经实现了而不是仅仅进行了声明。如果这是一个自定义开发的功能模块,请仔细检查源代码中的定义部分;如果是来自第三方库,则应查阅官方文档了解具体调用方式及其所在位置。 #### 检查头文件包含情况 对于 C/C++ 项目而言,务必保证所有必要的头文件都被适当包含了进来。缺少相应的 `.h` 或者 `.hpp` 文件可能会造成编译期间只识别到了函数原型却找不到实际体的情况。 ```cpp #include "necessary_header.h" ``` #### 审核库文件集成状况 针对依赖特定动态链接库(DLL)或静态库(LIB)的应用程序来说,应当核实以下几个要点: - 库文件确实存在于指定目录下; - Visual Studio 环境下的项目属性里已经指定了正确的库搜索路径; - 连接过程中加入了对应的 .lib 名字作为额外依赖项。 #### 更新工具链至最新稳定版 有时候旧版本的编译环境可能存在某些兼容性缺陷或是Bug,尝试更新IDE(如Visual Studio)[^2] 和其他相关组件到最新的发布版本往往能有效规避这些问题。 #### 探索替代性的解决方案 假如上述方法均未奏效,考虑到可能是由于原生支持不足或者其他复杂因素引起的问题,不妨考虑寻找开源社区提供的相似功能实现,或者是自行编写相应算法逻辑来绕过当前障碍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值