Raspberry Pi Zero OSでALSAプロジェクトのpcm.cサンプルをコンパイルする問題

Raspberry Pi Zero OSでALSAプロジェクトのpcm.cサンプルをコンパイルする問題

私はRaspberry Pi 0Wと最新のRaspberry Pi OSを使用しています。

私はlibasound2とlibasound2-devをインストールし、ラズベリーパイフォーラムalsa ライブラリが正しくコンパイルされ、実行されているかどうかをテストするために使用されます。

#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>
#include <alsa/pcm.h>

int main() {
  int val;

  printf("ALSA library version: %s\n", SND_LIB_VERSION_STR);

  printf("\nPCM stream types:\n");
  for (val = 0; val <= SND_PCM_STREAM_LAST; val++)
    printf("  %s\n",
      snd_pcm_stream_name((snd_pcm_stream_t)val));

  return 0;
}  

ALSAプロジェクトのWebサイトで提供されている正弦波生成のサンプルコードをコンパイルしようとしています。https://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_8c-example.html

これはサンプルページにpcm.cとしてリストされています。

このコードをmain.cppに保存し、次のように変更しました#include "../include/asoundlib.h"(これにより、コンパイル時にファイルが見つかりませんでしたエラーが発生しました)。#include <alsa/asoundlib.h>

私はこれを使ってこれをコンパイルしますgcc main.cpp -o main -lasound -fpermissive。一連の警告が表示されますが、最終的にディスプレイにはfor (format = 0; format < SND_PCM_FORMAT_LAST; format++) {andno match for operator++と宣言されましたoperand type is 'snd_pcm_format_t' {aka '_snd_pcm_format'})formatstatic snd_pcm_format_t format = SND_PCM_FORMAT_S16;snd_pcm_format_t彼らの文書によると

この基本的な例をコンパイルするにはどうすればよいですか?それとも、C ++を使用してALSAでサイントーンを生成する方法を示す簡単な例、またはALSAのサンプルコードの仕組みを説明するブログやチュートリアルはありますか?

編集:ビルド中に表示されるメッセージは次のとおりです。 [エラーは次のとおりです。main.cpp:842:66: エラー: 'operator++' と一致しません。]

$ gcc main.cpp -o Main -lasound -fpermissive
main.cpp:19:23: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
 static char *device = "plughw:0,0";         /* playback device */
                       ^~~~~~~~~~~~
main.cpp: In function ‘int write_and_poll_loop(snd_pcm_t*, short int*, snd_pcm_channel_area_t*)’:
main.cpp:314:18: warning: invalid conversion from ‘void*’ to ‘pollfd*’ [-fpermissive]
     ufds = malloc(sizeof(struct pollfd) * count);
            ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp: In function ‘void async_callback(snd_async_handler_t*)’:
main.cpp:397:77: warning: invalid conversion from ‘void*’ to ‘async_private_data*’ [-fpermissive]
 ct async_private_data *data = snd_async_handler_get_callback_private(ahandler);
                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~

main.cpp: In function ‘void async_direct_callback(snd_async_handler_t*)’:
main.cpp:469:77: warning: invalid conversion from ‘void*’ to ‘async_private_data*’ [-fpermissive]
 ct async_private_data *data = snd_async_handler_get_callback_private(ahandler);
                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~

main.cpp: In function ‘void help()’:
main.cpp:756:53: warning: invalid conversion from ‘int’ to ‘snd_pcm_format_t’ {aka ‘_snd_pcm_format’} [-fpermissive]
                 const char *s = snd_pcm_format_name(k);
                                                     ^
In file included from /usr/include/alsa/asoundlib.h:54,
                 from main.cpp:14:
/usr/include/alsa/pcm.h:1065:56: note:   initializing argument 1 of ‘const char* snd_pcm_format_name(snd_pcm_format_t)’
 const char *snd_pcm_format_name(const snd_pcm_format_t format);
                                 ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
main.cpp: In function ‘int main(int, char**)’:
main.cpp:842:27: warning: invalid conversion from ‘int’ to ‘snd_pcm_format_t’ {aka ‘_snd_pcm_format’} [-fpermissive]
             for (format = 0; format < SND_PCM_FORMAT_LAST; format++) {
                           ^
main.cpp:842:66: warning: no ‘operator++(int)’ declared for postfix ‘++’, trying prefix operator instead [-fpermissive]
             for (format = 0; format < SND_PCM_FORMAT_LAST; format++) {
                                                            ~~~~~~^~
main.cpp:842:66: error: no match for ‘operator++’ (operand type is ‘snd_pcm_format_t’ {aka ‘_snd_pcm_format’})
main.cpp:903:21: warning: invalid conversion from ‘void*’ to ‘short int*’ [-fpermissive]
     samples = malloc((period_size * channels * snd_pcm_format_physical_width(format)) / 8);
               ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:909:19: warning: invalid conversion from ‘void*’ to ‘snd_pcm_channel_area_t*’ {aka ‘_snd_pcm_channel_area*’} [-fpermissive]
     areas = calloc(channels, sizeof(snd_pcm_channel_area_t));
             ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$  

gccの代わりにg ++を使用すると、同じエラーが発生します。

ベストアンサー1

C++ プログラムでコンパイルしようとしています ("ISO C++ 禁止...")。したがって、埋め込まれたヘッダーはC ++ではなくCであるため、さまざまな警告が発生します。

main.cppCプログラムにコンパイルされるように名前を変更するか、使用するCヘッダーをmain.c含む正しいC ++メソッドを使用し、自分のコードがC ++標準に準拠していることを確認してください。extern "C"g++

おすすめ記事