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

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

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

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

C++

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

Q&A

解決済

1回答

5163閲覧

visual studio2019でFFTWを使いたいです。使用言語はC++です。アプリケーションエラーが発生します。

hanamur

総合スコア45

Visual Studio

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

C++

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

0グッド

0クリップ

投稿2021/08/31 09:45

編集2021/08/31 10:37

前提・実現したいこと

FFT(高速フーリエ変換)をvisual studio2019で使いたいです。

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

コマンドプロンプト上でfftwのアプリケーションを実行すると、
「アプリケーションを実行できませんでした(0xc000007b)。[OK]をクリックしてアプリケーションを閉じてください。」
と新しいウィンドウが出てきて表示されます。

該当のソースコード

https://w.atwiki.jp/amaeda/pages/12.html
↑のFFTW@wikiというサイトの「基本の使い方 1次元FFT」というサンプルプログラムをそのまま使っています。

c++

1#include <stdio.h> 2#define _USE_MATH_DEFINES 3#include <math.h> 4 5#include "fftw3.h" 6#pragma comment( lib, "fftw3.lib" ) //←ただしここは#pragma comment(lib, "libfftw3-3.lib")と書き換えました。 7 8#define SIZE 64 9 10int main( void ){ 11 12 fftw_complex *in = NULL; 13 fftw_complex *out = NULL; 14 fftw_plan p = NULL; 15 int i; 16 17 size_t mem_size = sizeof(fftw_complex) * SIZE; 18 in = (fftw_complex*)fftw_malloc( mem_size ); 19 out = (fftw_complex*)fftw_malloc( mem_size ); 20 21 if( !in || !out ){ 22 fprintf( stderr, "failed to allocate %d[byte] memory(-.-)\n", (int)mem_size ); 23 return false; 24 } 25 26 p = fftw_plan_dft_1d( SIZE, in, out, FFTW_FORWARD, FFTW_ESTIMATE ); 27 28 // input data creation 29 printf("----- INPUT -----\n"); 30 for( i=0; i<SIZE; i++ ){ 31 in[i][0] = 1 + 2*sin(2*M_PI*i/SIZE) + sin(4*M_PI*i/SIZE); 32 in[i][1] = 0; 33 printf("%d : %lf\n", i, in[i][0] ); 34 } 35 36 fftw_execute(p); 37 38 // output is DC exchanged and scaled. 39 double scale = 1. / SIZE; 40 printf("\n----- RESULT -----\n"); 41 for( i=0; i<SIZE; i++ ){ 42 printf("%d : %lf %lfi\n", i, out[i][0]*scale, out[i][1]*scale ); 43 } 44 45 if( p ) fftw_destroy_plan(p); 46 if( in ) fftw_free(in); 47 if( out ) fftw_free(out); 48 49 return true; 50}

試したこと

http://blog.livedoor.jp/locked_empty_shell/archives/8968994.html
↑このサイトの1~3章までの手順をそのまま踏襲しました。
つまり、FFTWのダウンロード、.libファイルの生成、インクルードパスの指定、リンカーの設定、環境変数の設定までをしました。
そののちvisual studio上で上記のソースコードをビルドしました。正常終了しました。
ソリューションのフォルダにDebugが作成されたため、コマンドプロンプトを開いて
cd C:\~~~\Debugとパスを入力して移動しました。
そこにあるfftw.exe(と名付けた)アプリケーションファイルを実行しましたが、
「アプリケーションを実行できませんでした(0xc000007b)。[OK]をクリックしてアプリケーションを閉じてください。」
と表示された次第です。

補足情報(FW/ツールのバージョンなど)

使用言語はC++,
PCのOSはWindows 10 Pro,
統合開発環境はVisual Studio 2019,
を使っています。

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

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

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

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

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

jbpb0

2021/08/31 10:24

c++のコードの一番最初の行のすぐ上に ```c++ だけの行を追加してください また、c++のコードの一番最後の行のすぐ下に ``` だけの行を追加してください そうすれば、 > (文字が大きくなるのを防ぐために#の前に@を書きました。) とかやらなくてもいいはず
hanamur

2021/08/31 10:37

ありがとうございます。 見やすくなりました。
Zuishin

2021/08/31 10:44

まず Windows update で OS を最新の状態にし、再起動してください。原因を探るのはそれが済んでからです。
hanamur

2021/08/31 10:51

最新の状態です。とあります。 ただいま再起動もしました。
Zuishin

2021/08/31 11:04

他のところはそのまま、上記ソースだけ Hello World に差し替えても同じ問題が起こりますか?
hanamur

2021/08/31 11:26

いいえ、起こりませんでした。 Hello World! と問題なく出力されました。
Zuishin

2021/08/31 11:38

じゃあソースコードに問題がある可能性が高いですね。 参考にしているのは 2008 年とかなり古いものなので、最新版の事情と合わないのかもしれません。 https://www.fftw.org/fftw3_doc/ こちらにチュートリアルがあるので、これに沿ってやってみてください。
hanamur

2021/08/31 18:22 編集

ありがとうございます。 チュートリアルを読みましたが、素人目ながらソースコード自体には問題はなさそうです。 一応ほかのサイトのサンプルプログラムでも全く同じエラーメッセージが出たのでコード以前の問題だと思います。 おそらくmatukesoさんの回答の二つ目が問題ではないかと考えられるので、よろしければZuishinさんもご意見ください。
guest

回答1

0

ベストアンサー

fftwのdllがパスにない。
fftwのdllは64bitだけどビルドしたExeが32bit(あるいは逆)。
じつはvc2010とかvc2005とかのランタイムが要る。
うえ3つのどれかでしょうが、eventvwrをみると不足したDLLがかいてあるかも。

投稿2021/08/31 14:20

matukeso

総合スコア1681

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

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

hanamur

2021/08/31 18:14 編集

二つ目な気がします。 http://blog.livedoor.jp/locked_empty_shell/archives/8968994.html このページのやり方で進めているのですが、このページの3.④にDebug | Win64と記述がありますが、私のほうではDebug | Win32となっています。 PCのデバイスの仕様というところを見てみると 64 ビット オペレーティング システム、x64 ベース プロセッサ とあるのでPCの問題ではないと思います。 visual studioのソリューションプラットフォームというところをx64にかえるとビルドで 「ライブラリのコンピュータの種類'x86'がターゲットのコンピューターの種類'x64'と競合しています」 というエラーメッセージが出てきました。 また、上記ホームページの2.2でライブラリファイルを生成する際、開発者用コマンドプロンプトで 「LINK : warning LNK4068: /MACHINE の指定がありません。X86 を既定とします。 ライブラリ libfftw3-3.lib とオブジェクト libfftw3-3.exp を作成中」 とあったのでx86(32bit?)がデフォルトで、生成されたライブラリファイルがx86になっているのだと思います。 このデフォルトの設定を変える方法をもし知っていたら、お願いします。 ↑この質問で解決につながるかも正直わかってないです。
hanamur

2021/08/31 18:27

補足ですが、dllはダウンロードした時点で入ってました。dllのbit数は64であってます。 生成した.libのbit数が問題だと思います。
yominet

2021/09/01 14:01

「warning LNK4068: /MACHINE の指定がありません。」 ← これ lib /def:*****.def /MACHINE:x64
hanamur

2021/09/01 19:53

出来ました。64bitの.libを生成するというのがカギだったみたいです。 皆さんありがとうございます。 ここを参考にする人がいるかもしれないので残しておくと、64bitの.libを生成するというのともうひとつ、visual studio2019でC++のコンソールアプリを作成して、最初に画面上部のソリューションプラットフォームというところをx64にする必要もあるみたいです。 また、私の参考にした↑のサンプルコードはサンプル実行結果とは違った値を出しますが、それで合ってます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問