gpt4 book ai didi

c++ - #include 要求#include 才能使构建成功

转载 作者:行者123 更新时间:2023-12-02 09:49:33 25 4
gpt4 key购买 nike

我需要在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 header 有关,因此我无法对其进行修改。看起来该版本无法找到一些基本的东西,例如 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中定义的。

最佳答案

正如您已经推断出的那样,问题在于avifile.h中存在使用使用 size_t 类型声明的变量或类成员的代码,这不是内置数据类型,而是在以下项之一中声明的“用户”定义的typedef标准系统标题。 stdlib.h header (尽管最好在C++代码中使用<cstdlib>)将在需要时自动包含该 header ,其他系统 header (如<iostream><cstddef>)也将自动包含该 header 。

通常,第三方 header (例如avifile.h)应自己检查必要的 header 依赖性,并在需要时显式对其进行#include。但是,对于您而言,该 header 似乎没有这样做。

因此,现在,您应该确保始终在#include行之前#include <avifile.h>其中一个系统标题。根据您的情况,我也将与该库的提供者联系,以使他们知道该问题,该问题(IMHO)应该被视为错误

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

关于c++ - #include <avifile.h>要求#include <stdlib.h>才能使构建成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61347474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com