问题
我正在尝试编写一个程序来侦听使用JACK audio server创建的音频流。单独使用时,该软件包可以正常工作,但是,当我尝试在文件中使用它并同时引用诸如iostream之类的标准c++库时,在第三方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位编译。
systemdeps.h
引发冲突的库头文件。引发错误的行已在下面标记。 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
最佳答案
该”systemdeps.h”
在提供这些typedef方面做得相当糟糕。根据您的评论,它正在检查错误的包含卫队。即使是正确的,如果在该 header 后面包含<stdint.h>
,也会遇到问题。因此,您必须做两件事。首先,无论您在哪里使用任何jack
header ,都应在添加#include <stdint.h>
header 的之前添加jack
。其次,在#include <stdint.h>
之后立即添加#define _STDINT_H
。这样,您就可以从编译器的 header 中获取typedef,并告诉”systemdeps.h”
不要提供其自己的定义。这很繁琐且容易出错,因此您可以考虑创建自己的 header ,以便在一处完成所有操作。
关于c++ - C++第三方库typedef与标准stdin.h冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51181008/