什么可能导致此链接器错误?

时间:2012-08-27 20:58:02

标签: c++ visual-studio-2010 visual-c++ linker-errors unresolved-external

我一直试图在静态变量上解决这个问题unresolved external symbol几个小时了,而且我的智慧结束了。我正在使用Visual Studio 2010.以下是对情况的简要概述:

有问题的项目:

-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文件。我确保包含目录很好。我已经确定静态变量的定义是合理的。如有必要,我会提供任何其他信息。

1 个答案:

答案 0 :(得分:1)

在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在导出符号的项目中定义。