【问题标题】:What could be causing this linker error?什么可能导致此链接器错误?
【发布时间】:2012-08-27 20:58:02
【问题描述】:

我已经尝试在静态变量上解决这个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 文件。我已经确保包含目录是好的。我已经确保静态变量的定义是正确的。如有必要,我会提供任何其他信息。

【问题讨论】:

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


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

【讨论】:

  • This 建议您不能导出数据,只能导出函数。这有改变吗?
  • @tmpearce 操作员可以对此进行测试并告诉我们。对我来说,那个链接看起来很奇怪,但话又说回来,这不是我第一次错了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 2011-01-07
  • 2020-05-02
  • 2011-06-25
  • 2023-03-24
  • 2012-05-05
  • 1970-01-01
相关资源
最近更新 更多