我正在使用c ++ / windows窗体(visual studio 2010)开展项目,我们有4个项目:
我们有:
警告LNK4221:此目标文件未定义任何先前未定义的公共符号,因此任何使用此库的链接操作都不会使用它
对于相同目标文件(.NETFramework,Version = v4.0.AssemblyAttributes.obj)中的3个静态库项目,出现此警告。
我们希望消除它,但经过一些搜索后,大多数主题都会将预编译的标题说成是我们不使用它的原因。
关于为何存在此警告以及如何消除此警告的任何新想法?
答案 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.obj
和 b.obj
中。此外,还有一个函数 func1,定义在 b.obj
中。链接器将以后进先出的方式处理 OBJ 文件,因此在处理 a.obj
时,它找不到任何新的公共符号,因为 b.obj
提供了 a.obj
具有的所有公共符号, LNK4221 会被抛出。如果将命令行 2 替换为以下内容
link /lib /out:test.lib b.obj a.obj
现在警告消失了!