#include <avifile.h> 需要 #include <stdlib.h> 才能使构建成功

#include <avifile.h> requires #include <stdlib.h> before to make build succeed

我需要使用 C++ 中的 avifile 库 (https://packages.debian.org/stretch/libavifile-0.7-dev)。

我有以下 main.cpp 文件作为最小可重现示例:

#include <avifile.h>

int main(void) {
    return 0;
}

我正在尝试在 Docker 容器中构建 main.cpp 文件(用于可重现的构建),使用此 Dockerfile 仅安装所需的依赖项:

FROM    debian:stretch

RUN     apt update \
 &&     apt install -y \
            g++ \
            libavifile-0.7-dev

当我在容器内构建时:

g++ -o main.o main.cpp `avifile-config --libs` `avifile-config --cflags` 

,解析为以下命令:

g++ -o main.o main.cpp -L/usr/lib/x86_64-linux-gnu -laviplay -I/usr/include/avifile-0.7

构建给出了很多错误,例如:

In file included from /usr/include/avifile-0.7/avm_stl.h:8:0,
                 from /usr/include/avifile-0.7/avifile.h:4,
                 from main.cpp:1:
/usr/include/avifile-0.7/avm_stl.h: In member function 'void avm::vector<Type>::erase(avm::vector<Type>::iterator)':
/usr/include/avifile-0.7/avm_stl.h:333:12: error: 'm_size' was not declared in this scope
     assert(m_size > 0);
            ^
In file included from main.cpp:1:0:
/usr/include/avifile-0.7/avifile.h: At global scope:
/usr/include/avifile-0.7/avifile.h:96:13: error: 'size_t' does not name a type
     virtual size_t GetHeader(void* pheader = 0, size_t size = 0) const =0;
             ^~~~~~
/usr/include/avifile-0.7/avifile.h:104:13: error: 'size_t' does not name a type
     virtual size_t GetAudioFormat(void* format = 0, size_t size = 0) const =0;
             ^~~~~~

导入 #include <avifile.h> 是错误的原因。这些错误与avifile headers有关,所以我无法修改它们。看起来构建找不到一些基本的东西,比如 m_sizesize_t。如果我在 :

之前添加 #include <stdlib.h>
#include <stdlib.h>
#include <avifile.h>

int main(void) {
    return 0;
}

然后,构建良好。

为什么我需要在此处包括 stdlib.havifile.h?我不是很熟悉 C++,但我知道 m_sizesize_t、...(avifile 都需要)虽然在 stdlib.h 中定义。

Why do I need to include stdlib.h along with avifile.h here?

稍后您自己回答:

I understand that m_size, size_t, ... (all required by avifile) is defined in stdlib.h though.

具体来说,size_t 是由 stdlib.h 定义的,m_size 只是头文件中定义为类型 size_t 的一个糟糕变量,而且由于编译器无法弄清楚那个类型是什么,它根本不认为它是为了进一步的错误检查而定义的。

正如您已经推断的那样,问题是 avifile.h 中的代码使用变量或 class 成员声明为 size_t 类型,即 不是 一个 in-built 数据类型,而是一个 'user' 定义的 typedef 在标准系统 header 之一中声明。 stdlib.h header(尽管在 C++ 代码中使用 <cstdlib> 更好)将自动包含 header,如果需要,其他系统也会 headers,像 <iostream><cstddef>.

通常,third-party header 像 avifile.h 应该自己检查必要的 header 依赖项,并在需要时显式地 #include 检查它们。但是,在您的情况下,header 似乎没有这样做。

因此,目前,您应该确保始终 #include 系统之一 header 在 #include <avifile.h> 行之前。 在你的情况下,我还会联系该库的提供者让他们知道这个问题,这个问题(恕我直言)应该被认为是一个错误

顺便说一句,你提到的m_size不是标准类型,但更有可能是classes之一的成员变量声明为 size_t 变量。