未引用函数的“未解析的外部符号”

Posted

技术标签:

【中文标题】未引用函数的“未解析的外部符号”【英文标题】:"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()) 中被引用。

【问题讨论】:

【参考方案1】:

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

【讨论】:

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

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

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

【讨论】:

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

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

【讨论】:

我想过这一点,但我喜欢将预定义列表保持在最低限度。我想我希望我缺少一些 VS 设置或 c++ 功能。

以上是关于未引用函数的“未解析的外部符号”的主要内容,如果未能解决你的问题,请参考以下文章

LNK2019:未解析的外部符号 _main 在函数 ___tmainCRTStartup 中引用

C++:错误 LNK2019:函数 _main 中引用的未解析的外部符号

在 Visual Studio 中构建 MATLAB mex 文件会给出“函数 mexFunction 中引用的 LNK2019 未解析的外部符号 _mexPrintf”?

函数_main(OPENGL C++)中引用的未解析的外部符号_____________

引用了未解析的外部符号 __imp__JNI_CreateJavaVM@12

未解析的外部符号 - GRPC