質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

1回答

1841閲覧

ALSAを使用しようとするとundefined reference toエラーがでる

退会済みユーザー

退会済みユーザー

総合スコア0

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

0クリップ

投稿2018/01/28 14:43

Ubuntu 12.04でVMware上で動かしています。C言語でALSAを使ってwavファイルを流そうとしてるのですが、
コンパイル時にsnd_pcm_の関数が軒並み読み込めないとエラーメッセージがでます。
http://d.hatena.ne.jp/harre_orz/20100314/1268562058
を参照しました。
コンパイルオプションに-lasoundはつけています。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <inttypes.h> 4 5#define ALSA_PCM_NEW_HW_PARAMS_API 6 7#include <alsa/asoundlib.h> 8 9int main(void) { 10 11 snd_pcm_t *handle; 12 snd_pcm_hw_params_t *params; 13 14 // PCMデバイスを プレイバックモード で開く 15 int rc = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0); 16 if (rc < 0) { 17 fprintf(stderr, "unable to open pcm device :%s\n", snd_strerror(rc)); 18 exit(1); 19 } 20 21 // ハードウェアパラメータの領域を確保 22 snd_pcm_hw_params_alloca(&params); 23 24 // handle ハードウェアパラメータのデフォルト値を取得 25 snd_pcm_hw_params_any(handle, params); 26 27 // 各種パラメータをハードウェアパラメータに設定 28 29 // ハードウェアパラメータに Interleaved mode に設定 30 snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED); 31 32 // フォーマットは 1チャネル 16bit リトルエンディアン 33 snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE); 34 35 // ステレオ 36 snd_pcm_hw_params_set_channels(handle, params, 2); 37 38 // ビットレートは CDのサンプリングレート (44100 bit/s) 39 int val = 44100; 40 int dir; 41 snd_pcm_hw_params_set_rate_near(handle, params, &val, &dir); 42 43 // フレームサイズ 44 snd_pcm_uframes_t frames = 32; 45 snd_pcm_hw_params_set_period_size_near(handle, params, &frames, &dir); 46 47 // ハードウェアパラメータをデバイスに適用 48 rc = snd_pcm_hw_params(handle, params); 49 if (rc < 0) { 50 fprintf(stderr, "unable to set hw parameters: %s\n", snd_strerror(rc)); 51 exit(1); 52 } 53 54 // 1フレーム間隔を取得するための必要なバッファサイズを取得 55 snd_pcm_hw_params_get_period_size(params, &frames, &dir); 56 int size = frames * 4; // 1サンプルあたり2バイトでかつ,2チャンネル 57 int16_t *buffer = (int16_t *)malloc(size); 58 59 snd_pcm_hw_params_get_period_time(params, &val, &dir); 60 61 int i; 62 while(1) { 63 rc = read(0, buffer, size); 64 if (rc == 0) { 65 fprintf(stderr, "end of input devce\n"); 66 break; 67 } 68 else if (rc != size) { 69 fprintf(stderr, "short read: read %d bytes\n", rc); 70 } 71 72 // 音量の調整もできる 73 for(i = 0; i < rc/2; i++) { 74 *(buffer+i) *= (double)0.5; 75 } 76 77 rc = snd_pcm_writei(handle, buffer, frames); 78 } 79 80 snd_pcm_drain(handle); 81 snd_pcm_close(handle); 82 free(buffer); 83 84 return 0; 85}

発生している問題・エラーメッセージ

vmware@vmware:~/Desktop/ALSAtest$ gcc -lasound main.c -o soundtest
/tmp/cccKBgfD.o: In function main': main.c:(.text+0x30): undefined reference to snd_pcm_open'
main.c:(.text+0x44): undefined reference to snd_strerror' main.c:(.text+0x70): undefined reference to snd_pcm_hw_params_sizeof'
main.c:(.text+0xa6): undefined reference to snd_pcm_hw_params_sizeof' main.c:(.text+0xd1): undefined reference to snd_pcm_hw_params_any'
main.c:(.text+0xeb): undefined reference to snd_pcm_hw_params_set_access' main.c:(.text+0x105): undefined reference to snd_pcm_hw_params_set_format'
main.c:(.text+0x11f): undefined reference to snd_pcm_hw_params_set_channels' main.c:(.text+0x146): undefined reference to snd_pcm_hw_params_set_rate_near'
main.c:(.text+0x16d): undefined reference to snd_pcm_hw_params_set_period_size_near' main.c:(.text+0x17f): undefined reference to snd_pcm_hw_params'
main.c:(.text+0x193): undefined reference to snd_strerror' main.c:(.text+0x1d3): undefined reference to snd_pcm_hw_params_get_period_size'
main.c:(.text+0x203): undefined reference to snd_pcm_hw_params_get_period_time' main.c:(.text+0x25a): undefined reference to snd_pcm_drain'
main.c:(.text+0x265): undefined reference to snd_pcm_close' main.c:(.text+0x31a): undefined reference to snd_pcm_writei'
collect2: ld はステータス 1 で終了しました

調べてみたところ、同じようなエラーに遭遇している人はいましたが解決していないみたいでした。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

gcc -lasound main.c -o soundtest
ではなく、
gcc main.c -lasound -o soundtest
にしてみてはどうでしょうか。

投稿2018/01/29 13:56

okrt

総合スコア366

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問