整容说文库 > 程序代码 > 教育资讯

请问出现连接错误LNK2001的原因?

来源:学生作业帮助网 编辑:整容说文库 时间:2021/04/11 20:58:41 程序代码
请问出现连接错误LNK2001的原因?程序代码
我写了一个Win32 API 程序,其中函数声明int getSysnamecount(void);放在一个头文件中,
然后在另一个.c文件中实现该函数(当然该文件包含了声明的头文件)。
然后在主函数包含该头文件,连接时的错误信息如下:

--------------------Configuration: fD - Win32 Debug--------------------
Linking...
fD.obj : error LNK2001: unresolved external symbol "int __cdecl getSysnamecount(void)" (?getSysnamecount@@YAHXZ)
Debug/fD.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
Creating browse info file...

fD.exe - 2 error(s), 0 warning(s)


按理说,错误的原因是没有定义函数体,但事实上我已经定义了啊,到底是什么原因呢,请各位指教?
定义函数的.c文件加入项目了吗?
如果不是在一个project中,lib加入input library modules中了吗?
1、检查是否是函数名拼写错误
2、检查是否包含了必要的头文件
3、检查是否在工程中添加了必要的头文件
楼上两位所说的问题都没有啊
我想是不是头文件"stdafx.h"惹的祸?
应该是名字修饰的问题,你使用c写的函数,链接的时候名字应该是_getSysnamecount。
getSysnamecount@@YAHXZ是一个c++形式的修饰名。

修改头文件
#ifdef TDLL_EXPORTS
#define TDLL_API __declspec(dllexport)
#else
#define TDLL_API __declspec(dllimport)
#endif

#if defined(__cplusplus)
extern "C" {
#endif 

TDLL_API int __cdecl getSysnamecount();

#if defined(__cplusplus)
}
#endif 
连接通过了,但是每个自定义的头文件到加这个东西吗?
会不会太麻烦了,有其它的办法不?
copy and paste. 头尾加一次,不算麻烦:)
或者你的dll使用cpp编写,就没有这个问题了
检查是否包含了必要的头文件
#ifdef TDLL_EXPORTS
#define TDLL_API __declspec(dllexport)
#else
#define TDLL_API __declspec(dllimport)
#endif

#if defined(__cplusplus)
extern "C" {
#endif 

TDLL_API int __cdecl getSysnamecount();/*TDLL_API 这个一定要加吗,有什么用*/

/*是不是在写所有函数的原型?*/




#if defined(__cplusplus)
}
#endif 


==========================================
Quote:
或者你的dll使用cpp编写,就没有这个问题了
==========================================

我没有使用DLL啊。
/*是不是在写所有函数的原型?*/ --对
如果不是DLL,可以去掉
#ifdef TDLL_EXPORTS
#define TDLL_API __declspec(dllexport)
#else
#define TDLL_API __declspec(dllimport)
#endif
以及TDLL_API 
#if defined(__cplusplus)
extern "C" {
#endif

................

#if defined(__cplusplus)
}
#endif  


上面这个宏定义是成对出现的吗?
具体是什么含义?
#if defined(__cplusplus)
extern "C" {
#endif 

TDLL_API int __cdecl getSysnamecount();

#if defined(__cplusplus)
}
#endif 

我猜:

本义是想写成没定义了_cplusplus时就用extern "C"吧,把函数调用说明成C的调用约定(__cdecl),如果没有的话,就默认为Pascal的调用约定(_stdcall,VC中默认的调用约定)

可实在是看上去不像啊
#if defined(__cplusplus)
extern "C" {
#endif 

int __cdecl getSysnamecount();

#if defined(__cplusplus)
}
#endif 

如果定义了c++的话,告诉编译器不要使用c++的名字修饰,而是使用c的名字修饰。
和调用约定没有关系:)
哦,谢谢了。
不过如果我开始建立的是一个控制台应用程序的话,不用加这个宏也可以连接啊。
就算是Win32 Application 不加这个宏,c的程序有时候也可以连接啊,但有时候不可以。
这其中的原因,请一一道来。
不知道你的环境,就没法判断了,呵呵
什么环境啊?
我用VC 6.0 啊。
程序代码