导出类的静态常量的未解决的外部符号链接错误(仅限某些项目)

Unresolved external symbol link error for exported class' static constants (some projects only)

提问人:grae22 提问时间:12/14/2016 更新时间:12/14/2016 访问量:70

问:

我在项目 Utils 中有一个类,如下所示:

数学.h

class __declspec(dllexport) Maths
{
public:
  static const double c_epsilon;

  ...
}

数学.cpp

const double Maths::c_epsilon = DBL_EPSILON;

然后,我有(许多)其他项目使用此类(并使用 c_epsilon 常量)。

几乎所有其他项目都可以毫无问题地构建和链接......但是有几个失败了,并出现错误:

LNK2001未解析的外部符号“__declspec(dllimport) public: static double const Maths::c_epsilon”(__imp_?c_epsilon@Maths@@2NB)

这两个失败的项目都是 Google 测试项目,除了生成可执行文件(而不是 DLL)之外,设置似乎与所有其他项目相同。

失败的项目肯定会指定 Utils.lib 文件。

我只能想象这是一个项目设置问题(因为其他项目很好),但我找不到任何不同的设置来解决问题。

C++ visual-studio-2015 未解析外部

评论

0赞 Kirill Kobelev 12/14/2016
您是否在解决方案中定义二进制文件之间的依赖关系?
0赞 grae22 12/14/2016
@KirillKobelev 是的,我是。
0赞 Kirill Kobelev 12/14/2016
然后 AFAIK,您无需指定 .lib 文件。Lib 文件应用于不属于解决方案的 DLL。
0赞 grae22 12/14/2016
@KirillKobelev 对不起,你是对的 - 对于 Utils 项目,没有定义依赖项,因为该项目不包含在解决方案中。

答:

1赞 grae22 12/14/2016 #1

事实证明,有问题的项目将输出文件夹 $(OutDir) 指定为查找其他依赖项的路径。这是有问题的,因为在构建的这一点上,输出文件夹仍然包含“旧”的 lib 文件,这些文件被复制为构建后步骤(一个可能应该审查的过程)。

“旧”lib 文件来自一个构建,其中常量实际上并没有声明为“const”(只是静态)——这已被更改,因此产生了未解决的外部符号错误。