数小时以来,我一直在尝试通过静态变量来解析此unresolved external symbol,但我已经不知所措了。我正在使用Visual Studio2010。这是这种情况的简化概述:

有问题的项目:

-ProjA (outputs a .dll and .lib)
-ProjB (outputs a .exe)


在ProjA中,我有以下两个文件:

//foo.h
#pragma once

class SUP
{
public:
    static int staticint;
};




//foo.cpp
#include "foo.h"
int SUP::staticint = 10;


ProjB链接到ProjA.lib

//main.cpp
#include "{Full_Path}foo.h"
int main(){
   std::cout << SUP::staticint << std:: endl;
}


现在,main.cpp编译没有任何问题,但是当我尝试构建项目时,出现以下错误:

main.obj : error LNK2001: unresolved external symbol "public: static int SUP::staticint" (?staticint@SUP@@2HA)

我几乎100%可以肯定我已经正确设置了ProjB的选项。在“其他依赖项”下,我都有“ ProjA.lib”,在“其他库目录”下,我具有生成ProjA.lib文件的目录的路径。

我什至让ProjA输出了一个.map文件,在地图中我发现:
0003:00004458 ?staticint@SUP@@2HA 10049458 foo.obj

所以我猜这意味着staticint已正确定义。

可能出什么问题了?显然,我做错了,但是我看不到。我已确保ProjB与正确的.lib文件链接。我确保include目录是好的。我确保静态变量的定义是正确的。如有必要,我将提供其他信息。

最佳答案

在MSVS下,必须使用__declspec(dllexport)显式声明要导出的符号。

由于SUP在不同的库中,因此只有导出的符号可用于其他模块,这些模块必须将其标记为__declspec(dllimport)

这种双重行为通常是通过宏实现的:

#ifdef EXPORT_MODULE
#define DLLIMPEXP __declspec(dllexport)
#else
#define DLLIMPEXP __declspec(dllimport)
#endif


并且该类声明为

class DLLIMPEXP SUP
{
public:
    static int staticint;
};


其中在导出符号的项目中定义了EXPORT_MODULE

10-08 08:21