消除MS Visual C++链接器警告的最佳方法是什么:"警告LNK4221"?

Adi*_*sak 17 c++ linker suppress-warnings visual-c++

我有一个CPP源文件,使用#if/#endif在某些版本中完全编译.但是,这会产生以下警告.

warning LNK4221: no public symbols found; archive member will be inaccessible
Run Code Online (Sandbox Code Playgroud)

我正在考虑创建一个宏来生成一个实际上不会被使用的虚拟变量或函数,因此这个错误会消失但我想确保它不会导致问题,例如在多个文件中使用宏导致链接器对多重定义的符号进行炸弹.

摆脱此警告的最佳方法是什么(不要简单地抑制链接器命令行上的警告)?

FWIW,我有兴趣知道如何通过抑制链接器命令行上的警告来实现它,但我所有的尝试似乎都被链接器忽略,但仍然产生错误.

另一个要求:修复必须能够经得起单个文件构建或统一构建(结合CPP文件构建),因为我们的构建配置之一是批量构建(如统一构建但是批量文件组而不是单个主文件统一档案).

Pav*_*aev 20

使用匿名命名空间:

namespace { char dummy; };
Run Code Online (Sandbox Code Playgroud)

此命名空间中的符号具有外部链接,因此导出表中将存在某些内容.另一方面,命名空间名称本身对于每个翻译单元都是不同的(您可以将其视为"随机生成"),因此没有冲突.

  • 我认为他的"统一构建"将所有cpp文件合在一起并将它们编译为单个翻译单元.因此`(anonymous):: dummy`在每个中都是相同的符号,编译器会抱怨多个定义.他的解决方法是将`dummy`对象与`__LINE__`区分开来. (3认同)

Adi*_*sak 12

好的,我将要使用的修复程序是Pavel的一个小调整的建议.我使用此修复程序的原因是它是一个简单的宏,它将在批量构建/统一构建以及正常构建中工作:

共享标题:

// The following macro "NoEmptyFile()" can be put into a file
// in order suppress the MS Visual C++ Linker warning 4221
//
// warning LNK4221: no public symbols found; archive member will be inaccessible
//
// This warning occurs on PC and XBOX when a file compiles out completely
// has no externally visible symbols which may be dependant on configuration
// #defines and options.

#define NoEmptyFile()   namespace { char NoEmptyFileDummy##__LINE__; }
Run Code Online (Sandbox Code Playgroud)

可以完全编译的文件:

NoEmptyFile()
#if DEBUG_OPTION
      // code
#endif // DEBUG_OPTION
Run Code Online (Sandbox Code Playgroud)