#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_size
和 size_t
。如果我在 :
之前添加 #include <stdlib.h>
#include <stdlib.h>
#include <avifile.h>
int main(void) {
return 0;
}
然后,构建良好。
为什么我需要在此处包括 stdlib.h
和 avifile.h
?我不是很熟悉 C++,但我知道 m_size
、size_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
变量。
我需要使用 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_size
和 size_t
。如果我在 :
#include <stdlib.h>
#include <stdlib.h>
#include <avifile.h>
int main(void) {
return 0;
}
然后,构建良好。
为什么我需要在此处包括 stdlib.h
和 avifile.h
?我不是很熟悉 C++,但我知道 m_size
、size_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
变量。