问题

我正在尝试编写一个程序来侦听使用JACK audio server创建的音频流。单独使用时,该软件包可以正常工作,但是,当我尝试在文件中使用它并同时引用诸如iostream之类的标准c++库时,在第三方lib和stdint.h之间会引发typedef冲突错误。

对于文件,我使用的都是JACK包中的jack/jack.hjack/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/

10-12 18:23