【问题标题】:Portaudio example "record_file.c" does not find "min"Portaudio 示例“record_file.c”未找到“min”
【发布时间】:2015-04-23 23:14:01
【问题描述】:

首先,我已经让较小的示例 paex_record.c 可以工作。

我在 Windows8 上使用 MinGW 并确实从源代码编译了 portaudio,这就是我从 libportaudio-2.dll 那里得到的。

我在 QtCreator(没有 gui)中使用以下 .pro 文件设置了一个项目:

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp

LIBS += -LC:/Audio/patest/paex_record_file -llibportaudio-2

我的文件夹C:/Audio/patest/paex_record_file 看起来像:

libportaudio-2.dll
main.cpp
pa_ringbuffer.c
pa_ringbuffer.h
pa_util.h
paex_record_file.pro
paex_record_file.pro.user
portaudio.h

在找不到 pa_ringbufferpa_util 后,我将它们复制到此文件夹。 Main.cpp包含来自 portaudio 源的整个示例文件 paex_record_file.c

调用 ringbuffer 时出现错误(第 246 和 271 行:source): "min" was not declared in this scope

我认为这个示例会像 record.c 示例一样直接运行。

我需要包含更多的软件包吗?我试过algorithmmathstdusing namespace std,但仍然出现错误。但是我觉得它应该可以解决,也许我的包含文件或文件夹设置/链接不正确?

编辑:好的,所以我自己定义了一个最小函数。现在它抛出不同的错误: undefined reference to "PaUtil_GetRingBufferReadAvailable" 还有一些这样的。可能是缺少一个lib需要链接,看看...

【问题讨论】:

  • windows.h 有 min 和 max 的宏,这可能会造成干扰,在包含它之前尝试 #define NOMINMAX
  • 这不起作用。 define NOMINMAX 也定义在 windows.h 如果 RC_INVOKED 被定义,但我不知道后者是否被定义。对我的帖子进行了编辑。

标签: c++ c portaudio


【解决方案1】:

我在尝试编译 paex_record_file.c 时也遇到了这个链接错误。原来你需要在编译主文件之前编译pa_ringbuffer.c。还有对一些alloc函数的外部依赖,所以你需要修改文件中的两行。

我对 qt 不太了解,但您需要执行以下操作:

SOURCES += pa_ringbuffer.c main.cpp

这是我使用 MinGW 编译的方法:

paex_record_file.c 内部的变化

Line 313 : data.ringBufferData = (SAMPLE *) malloc( numBytes );
Line 443 : free( data.ringBufferData );

用 MinGW 编译:

gcc -o p_rec.exe C:\path_to_portaudio\portaudio\common\pa_ringbuffer.c \
paex_record_file.c -lportaudio \
-IC:\path_to_portaudio\portaudio\src\common

我没有遇到最小问题,但也许您可以尝试删除 ifdef 保护并尝试重新编译。

#ifdef _WIN32
#include <windows.h>
#include <process.h>
#endif

#include <windows.h>
#include <process.h>

【讨论】:

    猜你喜欢
    • 2020-05-16
    • 1970-01-01
    • 2014-11-28
    • 2016-03-23
    • 2012-11-02
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2019-12-19
    相关资源
    最近更新 更多