我想使用stb_image库,作者已将其放入一个非常大的头文件中。 要使用该库,文档告诉我将这两行添加到我的代码中。
#ifndef STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#endif
我做到了这一点,将其放入头文件中;我甚至确保它包括警卫。
pip install --upgrade pip
然而,链接器抱怨了。
我抬头找到解决方案。 https://github.com/nothings/stb/issues/3
基本上,我必须将上面的两行添加到cpp文件而不是头文件。它就像一个魅力。 但是为什么头球卫士没有这种方式有效?我一直在阅读有关翻译单元和静态的文章,但我无法理解为什么我的方法不起作用。
答案 0 :(得分:2)
stb_image.h有自己的包含警卫。这不是定义STB_IMAGE_IMPLEMENTATION
的原因。定义STB_IMAGE_IMPLEMENTATION
告诉stb_image.h不仅要包含声明,还要将 definitions 的函数和变量包含在该转换单元中。如果stb_image.h包含在定义了STB_IMAGE_IMPLEMENTATION
的多个翻译单元中,则所有这些翻译单元都将具有stb_image函数和变量的定义,并且违反了单定义规则。