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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1325閲覧

OpenAL softのサンプルプログラムのビルド時にLNK2019が生じる

KeiyaShimizu

総合スコア7

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/05/19 04:45

実現したいことと問題

OpenAL Softのサンプルプログラム(altonegen.c)を実行させたいのですが,
LNK2019が生じてしまい実行できていません.

他の質問を参考にプロパティなどを変え,他のエラーは出なくなったのですが,以下に示す問題だけ解決しません.

環境

windows10 
システムの種類 64 ビット オペレーティング システム、x64 ベース プロセッサ
visual studio 2019
OpenAL Soft 1.22.0

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

エラー文のInitAL,CloseAL,al_nssleep等は,alhelpers.hで定義された関数です.

1>------ ビルド開始: プロジェクト: test2, 構成: Debug x64 ------ 1>ソース.obj : error LNK2019: 未解決の外部シンボル InitAL が関数 "int __cdecl my_main(int,char * *)" (?my_main@@YAHHPEAPEAD@Z) で参照されました 1>ソース.obj : error LNK2019: 未解決の外部シンボル CloseAL が関数 "int __cdecl my_main(int,char * *)" (?my_main@@YAHHPEAPEAD@Z) で参照されました 1>ソース.obj : error LNK2019: 未解決の外部シンボル al_nssleep が関数 "int __cdecl my_main(int,char * *)" (?my_main@@YAHHPEAPEAD@Z) で参照されました 1>MSVCRTD.lib(exe_winmain.obj) : error LNK2019: 未解決の外部シンボル WinMain が関数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) で参照されました 1>C:\Users\Shimizu\source\repos\test2\x64\Debug\test2.exe : fatal error LNK1120: 4 件の未解決の外部参照 1>プロジェクト "test2.vcxproj" のビルドが終了しました -- 失敗。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

試したことや調べたこと

1. OpenALsoftのHPからダウンロードし,必要なライブラリやヘッダファイルを入手しました
OpenAL soft -> Download

ダウンロード①
The latest release is 1.22.0, and is available in source form.
openal-soft-1.22.0.tar.bz2

→ヘッダファイルなど

ダウンロード②
Win32 and Win64 binaries are also provided.
openal-soft-1.22.0-bin.zip

→主にWin64用のライブラリ

2. 必要なファイルをtest2.slnがあるディレクトリに移動
ヘッダファイルは全てmy_headerという名前のフォルダにまとめ,ソリューションファイル(今回で言うtest2.sln)があるディレクトリに置いています.同じディレクトリにライブラリであるOpenAL32.libをmy_libraryという名前のフォルダに入れています.

イメージ説明

3. 調べたこと
他の質問を調べて,プロパティの設定を変えてみたのですが,上記のエラーだけ解決できません.ライブラリのリンカを正しく指定したり,ヘッダファイルに対するincludeパスを指定したり,追加の依存ファイルにOpenAL32.libを指定したりしましたが,うまくいきません.

teratail 参考①
teratail 参考②

プラットフォームはx64でデバッグを行いました.

ライブラリも,名前は32と書いてありますが,OpenAL Softのフォルダの,openal-soft-1.22.0-bin\libs\Win64 においてあるものを利用しているので,ビット数の問題でもないのかなと考えています...

4. 原因として考えられるもの
メインのプログラムファイルの拡張子を.c→.cpp変えてしまったことが原因ではないかと考えています.
拡張子.cで提供されていたサンプルプログラム(altonegen.c)をコピペして,今回のサンプルを実行しようとしています.公式HPあたりを参考にしてみて,もとの拡張子が異なるため未解決のシンボルとなってしまうのかなと考えたのですが,初学者のため理解に苦戦しています...

Microsoft Build

該当のソースコード

エラー文にあった関数が定義されているalhelpers.hを記載しました.,test2.cpp(altonegen.c),al.hは文字数の都合で記載していません.お時間ございましたらこちらからダウンロードお願いいたします...

OpeaAL Soft->Download

エラーに現れたInitAL(test2.cppコードの中盤くらいにある)などはalhelpers.hで定義されたものです.

alhelpers.h

C++

1/*alhelpers.h*/ 2#ifndef ALHELPERS_H 3#define ALHELPERS_H 4 5#include "al.h" 6 7#ifdef __cplusplus 8extern "C" { 9#endif 10 11/* Some helper functions to get the name from the format enums. */ 12const char *FormatName(ALenum type); 13 14/* Easy device init/deinit functions. InitAL returns 0 on success. */ 15int InitAL(char ***argv, int *argc); 16void CloseAL(void); 17 18/* Cross-platform timeget and sleep functions. */ 19int altime_get(void); 20void al_nssleep(unsigned long nsec); 21 22/* C doesn't allow casting between function and non-function pointer types, so 23 * with C99 we need to use a union to reinterpret the pointer type. Pre-C99 24 * still needs to use a normal cast and live with the warning (C++ is fine with 25 * a regular reinterpret_cast). 26 */ 27#if __STDC_VERSION__ >= 199901L 28#define FUNCTION_CAST(T, ptr) (union{void *p; T f;}){ptr}.f 29#elif defined(__cplusplus) 30#define FUNCTION_CAST(T, ptr) reinterpret_cast<T>(ptr) 31#else 32#define FUNCTION_CAST(T, ptr) (T)(ptr) 33#endif 34 35#ifdef __cplusplus 36} // extern "C" 37#endif 38 39#endif /* ALHELPERS_H */ 40

補足情報

どうかお力添えを頂けると幸いです...

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

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

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

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

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

guest

回答2

0

ベストアンサー

1>ソース.obj : error LNK2019: 未解決の外部シンボル InitAL が関数 "int __cdecl my_main(int,char * *)" (?my_main@@YAHHPEAPEAD@Z) で参照されました
1>ソース.obj : error LNK2019: 未解決の外部シンボル CloseAL が関数 "int __cdecl my_main(int,char * *)" (?my_main@@YAHHPEAPEAD@Z) で参照されました
1>ソース.obj : error LNK2019: 未解決の外部シンボル al_nssleep が関数 "int __cdecl my_main(int,char * *)" (?my_main@@YAHHPEAPEAD@Z) で参照されました

は、「alhelpers.h」と同じ場所にある「alhelpers.c」内で定義されてるので、それも「altonegen.c」と一緒にコンパイルしてください

投稿2022/05/19 08:10

編集2022/05/19 08:13
jbpb0

総合スコア7653

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

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

KeiyaShimizu

2022/05/19 08:16

ありがとうございます!!先ほどまさに,jbpb0さんに回答して頂いた方法で解決できました!ベストアンサーを送れず申し訳ありません...
jbpb0

2022/05/19 08:19

y_waiwaiさんの回答をベストアンサーにしたら、同じエラーに悩む第三者が見た時に、ファイル名の拡張子を.c→.cppとしたのが原因、と誤解して、自分は拡張子を変えてないのに何で?? ってさらに悩ませますよ コメントまで読む人は少ないので
KeiyaShimizu

2022/05/19 08:34 編集

ご指摘ありがとうございます.BAを変更できることを知りませんでした.確かにこちらの回答を先に見た方が他の方にとっては親切ですね.こちらをBAにします.
guest

0

メインのプログラムファイルの拡張子を.c→.cpp変えてしまったことが原因ではないかと考えています.

なら、それらを.cに戻してやってみては

投稿2022/05/19 05:04

y_waiwai

総合スコア88024

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

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

KeiyaShimizu

2022/05/19 05:11

今サンプルプログラムからそのまま持ってきたaltonegen.cをビルドしてみましたが,まったく同じエラー文が出ました
y_waiwai

2022/05/19 05:16

それらのcファイルはプロジェクトの中に含まれていますか?
KeiyaShimizu

2022/05/19 05:33 編集

はい.ソースファイル右クリック>追加>既存の項目,で追加しました.元あったtest2.cppは削除してクリーンとビルドを行いました.またaltonegen.cをソリューションのあるディレクトリに移しました
y_waiwai

2022/05/19 05:50

そのエラーメッセージはそれらの関数(の実態)が存在しない、というもんです その関数が記述されているところはわかるでしょうか そして、そのファイルがビルド対象に入ってるのを確認しましょう
KeiyaShimizu

2022/05/19 08:12

解決しました!y_waiwaiさんの仰った通り,関数が記述されているファイルがプロジェクト内に無かったことが原因でした.alhelpers.h以外に,alhelpers.cというものがあり,そちらをプロジェクト内の同じディレクトリにおいてビルドしたところ上手くいきました!恐らく非常に初歩的なことだったと思います... ソリューション ┗プロジェクト  ┗ソースファイル   ┗altonegen.c    ┗func1    ┗func2 etc..   ┗alhelpers.c    ┗InitAL  ←目的の関数    ┗CloseAL ← 自分の不勉強でした... 今後はまず,ビルドやリンカ,関数の原理などを勉強しようと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問