如何消除警告LNK4221?

时间:2013-12-31 08:35:21

标签: c++ linker

我正在使用c ++ / windows窗体(visual studio 2010)开展项目,我们有4个项目:

  • 包含GUI窗口的1个项目形成{托管代码},这是exe项目
  • 其他3个项目{非托管代码},都是静态库。
  • 在4个项目中我们不使用预编译的头文件stdafx.h,而公共语言运行时支持是纯MSIL公共语言运行时支持(/ clr:pure)。
  • 每个项目都包含其他3个项目作为附加包含目录,链接库依赖项设置为yes。

我们有:

  

警告LNK4221:此目标文件未定义任何先前未定义的公共符号,因此任何使用此库的链接操作都不会使用它

对于相同目标文件(.NETFramework,Version = v4.0.AssemblyAttributes.obj)中的3个静态库项目,出现此警告。

我们希望消除它,但经过一些搜索后,大多数主题都会将预编译的标题说成是我们不使用它的原因。

关于为何存在此警告以及如何消除此警告的任何新想法?

6 个答案:

答案 0 :(得分:11)

免责声明:此解决方案确实非常糟糕,此代码不应添加到生产版本中!只有“隐藏”警告才有用。

更好的解决方案是从编辑中删除有问题的文件,因为它无论如何都是无用的。

原帖:

我遇到了来自多个依赖项的警告问题,我发现它是由某些翻译单元为空而导致的,即空源文件。

这些文件实际上有一个内容但是它已经停用了visual studio,所以我刚开始添加:

__declspec( dllexport ) void getRidOfLNK4221(){}

现在我的项目编译没有任何警告:)

希望它有所帮助,即使这是一个迟到的答案!

答案 1 :(得分:7)

我有一个带有空模块的c ++静态库,在非优化模式下链接它给了我LNK4221警告。 (在Visual Studio中) 我去了Librarian->所有选项,并将“/ ignore:4221”添加到其他选项。 所以,警告已经消失了。

答案 2 :(得分:6)

您收到此警告是因为您只在cpp文件中使用模板类。 要摆脱它,插入一个没有模板的简单函数。

答案 3 :(得分:0)

这只是我的特殊问题,但如果您的.cpp没有定义任何新函数或者具有构造函数的空体,那么您将收到此警告。我为构造函数使用了初始化列表,因此正文是空的。

答案 4 :(得分:0)

看到这个: https://docs.microsoft.com/en-us/cpp/error-messages/tool-errors/linker-tools-warning-lnk4221

总之,该文件不会导出任何内容,因此链接器不会链接,因为它认为这是浪费精力

答案 5 :(得分:0)

https://devblogs.microsoft.com/cppblog/linker-warning-lnk4221-and-some-tips-to-avoid-it/

<块引用>

在“Visual Studio 2008 Command Prompt”中,输入以下命令(注意:这里我们使用命令行来指定.obj文件的顺序;Visual Studio 2008将按字母顺序提供.obj文件的链接器)

cl /c a.cpp b.cpp

link /lib /out:test.lib a.obj b.obj

对于 a.obj 将抛出 LNK4221,如下所示。

a.obj : warning LNK4221: no public symbols found; archive member will be inaccessible

对于上述情况,atlbase.h(Visual Studio 附带)包含一些符号定义,这些定义将包含在 a.objb.obj 中。此外,还有一个函数 func1,定义在 b.obj 中。链接器将以后进先出的方式处理 OBJ 文件,因此在处理 a.obj 时,它找不到任何新的公共符号,因为 b.obj 提供了 a.obj 具有的所有公共符号, LNK4221 会被抛出。如果将命令行 2 替换为以下内容

link /lib /out:test.lib b.obj a.obj

现在警告消失了!