错误LNK2001:未解析的外部符号

error LNK2001: unresolved external symbol

本文关键字:外部 符号 LNK2001 错误      更新时间:2023-10-16

visualstudio2010中的sln文件中有两个VC++项目。我想在另一个项目的文件中使用a_flag,这可能是我在下面做的吗?

项目1:

**sample_header.h**

#ifndef SAMPLE_HEADER_API
#define SAMPLE_HEADER_API __declspec(dllimport) 
#endif
 extern SAMPLE_HEADER_API int a_flg;
**file1.cpp**
#define SAMPLE_HEADER_API __declspec(dllexport)
#include "sample_header.h"
// Intialization of external
int a_flag = 15;
void m_func()
{
  int i = 0;
}

项目2:

**file2.h**
 #include <stdio.h>
**file2.cpp**
 #include "file1.h"
 #include "sample_header.h"
 //  provided path of "sample_header.h" in additional include directory as well
void main()
{
   if(a_flag > 0)
   {
     std::cout << "FLAG"  ;
   }
}          

我将project1设置为DLL,将project2设置为EXE项目。

在链接中,我得到了这个错误:

error LNK2001: `unresolved external symbol "__declspec(dllimport) int a_flg" (__imp_?a_flg@@3HA)` in file2.cpp

我已经阅读了微软关于DLL创建和链接的页面,但不知道如何解决这个外部符号错误。

谢谢!

您需要设置创建.dll的项目,以同时生成.lib文件(导入库)。

链接的快速描述应该是这样的:

DLL依赖项目->Dependency.DLL+Dependency.lib

主项目->在运行时依赖depedency.dll,在链接时依赖dependency.lib.

换句话说,你的.dll只是另一个公开一些函数签名的二进制文件。

在运行时,您可以选择c链接,该链接涉及通过名称在dll中查询公开的函子/变量(这是一种很难的方法,但在手头没有.dll源代码时很有用),或者使用一种更优雅的方法将生成的静态库与main链接。

当使用第一种方法时,如果找不到特定的.dll,则需要处理代码内部。

当使用第二种方法时,当您尝试运行二进制文件时,它将知道它依赖于某个.dll。

以下是一个非常有用的答案:如何在Visual C++中构建导入库(.lib)和DLL?