我正在尝试编写一个程序,以监听使用JACK audio server创建的音频流。单独使用时,该程序包可以正常工作,但是,当我尝试在文件中使用该文件以及对iostream之类的标准c ++库的引用时,在第3方lib和stdint.h之间会引发typedef冲突错误。
对于文件,我使用的都是JACK包中的jack/jack.h
和jack/types.h
。它们包括对systemdeps.h
文件的引用(在下面进行了扩展),这是错误的根源。
我试图在线查找解决方案,但是似乎没有任何效果。对于可能导致此问题的任何见解,或解决该问题的正确方向的观点,将不胜感激。
2>\Jack\includes\jack/systemdeps.h(69): error C2371: 'int8_t': redefinition; different basic types (compiling source file src\jack\jack_interface.cpp)
2>stdint.h(17): note: see declaration of 'int8_t' (compiling source file src\jack\jack_interface.cpp)
2>\Jack\includes\jack/systemdeps.h(73): error C2371: 'int32_t': redefinition; different basic types (compiling source file src\jack\jack_interface.cpp)
2>stdint.h(19): note: see declaration of 'int32_t' (compiling source file src\jack\jack_interface.cpp)
2>\Jack\includes\jack/systemdeps.h(74): error C2371: 'uint32_t': redefinition; different basic types (compiling source file src\jack\jack_interface.cpp)
2>stdint.h(23): note: see declaration of 'uint32_t' (compiling source file src\jack\jack_interface.cpp)
// jack_interface.cpp
#include <iostream>
#include "jack/jack.h" // Core library .h
#include "jack/types.h" // library types .h
#include "jack/jack_interface.h" // My .h extending the lib
namespace jack
{
}
这是我能写出引发错误的最低要求。
jack_interface.h为空。
jack.h和types.h都包含对systemdeps.h的引用,该冲突是在其中创建的。
仅在包含库和引用stdint.h的任何标准C ++文件都包含时(例如,仅 会引发错误)。 iostream。如果删除iostream,该库将运行100%。
我从第3方软件包中使用的库适用于32位Windows。我正在使用Visual Studio 2017进行32位编译。
正在引发冲突的库头文件。引发错误的行已在下面标记。 See file on github here.
#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(GNU_WIN32)
#include <windows.h>
#ifdef _MSC_VER /* Microsoft compiler */
#define __inline__ inline
#if (!defined(int8_t) && !defined(_STDINT_H))
#define __int8_t_defined
typedef char int8_t; <-- ERROR
typedef unsigned char uint8_t;
typedef short int16_t;
typedef unsigned short uint16_t;
typedef long int32_t; <-- ERROR
typedef unsigned long uint32_t; <-- ERROR
typedef LONGLONG int64_t;
typedef ULONGLONG uint64_t;
#endif
答案 0 :(得分:3)
”systemdeps.h”
在提供这些typedef方面做得相当糟糕。根据您的评论,它正在检查错误的包含卫队。即使是正确的,如果在该标头后面包含<stdint.h>
,也会遇到问题。因此,您必须做两件事。首先,无论您在哪里使用任何jack
标头,都应在添加#include <stdint.h>
标头之前,先在{strong>之前添加jack
。其次,在#include <stdint.h>
之后立即添加#define _STDINT_H
。这样,您就可以从编译器的标头中获取typedef,并告诉”systemdeps.h”
不要提供其自己的定义。这很繁琐且容易出错,因此您可以考虑创建自己的标头,以便在一处完成所有操作。