【问题标题】:"unresolved external symbol" for unreferenced function未引用函数的“未解析的外部符号”
【发布时间】:2009-08-19 21:43:01
【问题描述】:

我在 Visual Studio 2003 中。我在一个非常常见的模块中有一个函数,它需要 3 个其他模块。我只希望使用新函数的项目必须包含其他 3 个模块,以及那些不引用该函数以链接而不会出现“未解决的外部符号”错误的项目。我尝试了函数级链接、OPT:REF 和我能想到的每个项目设置,但链接器总是抱怨。我做了一个简单的例子来测试。任何想法都会很棒......

//main.cpp
//#include "a.h"
int _tmain(int argc, _TCHAR* argv[])
{
  //a();
  return 0;
}

//a.h
#include "b.h"
void a();

//a.cpp
#include "a.h"
#include "b.h"
void a()
{
  b();
}

//b.h
void b();

//b.cpp
#include "b.h"
void b()
{
}

只要 a() 从未被调用,我需要在项目中只使用 main.cpp 和 a.cpp 来编译项目。如果在 _tmain() 中调用了 a(),那么当然需要将 b.cpp 添加到项目中。

链接器似乎不会应用 OPT:REF,直到确定引用的每个函数都在项目中之后。即使它 (b()) 在未引用的函数 (a()) 中被引用。

【问题讨论】:

    标签: c++ linker visual-studio-2003


    【解决方案1】:

    您是否考虑过制作一个包含可选函数及其三个依赖项的库?

    【讨论】:

    • 这就是我们稍后要做的事情。我正在谈论的通用模块称为 string_utilities.h,它被广泛使用。我想我希望有一个不需要修改大量项目的简单修复。我不喜欢 libs 的一点是,有时您可能会因不同的项目设置和垃圾而陷入其他麻烦。 string_utilities.h/cpp 应该是随处可见的简单快捷的东西。
    【解决方案2】:

    我在一个非常常见的模块中有一个函数,它需要 3 个其他模块。我只希望使用新函数的项目必须包含其他 3 个模块,以及那些不引用该函数以链接而不会出现“未解决的外部符号”错误的项目。

    在我看来,您应该将此新功能分离到不同的模块中。 (不要放在公共模块中)。这样,谁需要它就可以包含它,谁不需要它,就不会。否则,您将被某些只能导致麻烦的条件编译宏卡住。

    【讨论】:

    • 我在 string_utilities 模块中添加了加密/解密函数。我猜想什么都做的单片模块并不理想。
    • 另外,我同意条件编译宏并不理想。
    【解决方案3】:

    顺便说一句,用#ifdef 围绕有问题的a() 调用,在b() 旁边寻找#defined 的东西听起来很有希望。

    【讨论】:

    • 我想过这一点,但我喜欢将预定义列表保持在最低限度。我想我希望我缺少一些 VS 设置或 c++ 功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多