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

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

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

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

Visual Studio

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

C++

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

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

Q&A

解決済

2回答

13011閲覧

Visual Studio / C++によるDLLビルドにおいて参照したDLLの依存がおかしい

ruccho

総合スコア285

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

Visual Studio

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

C++

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

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

0グッド

0クリップ

投稿2018/02/13 10:01

前提・実現したいこと

FFmpegのAPIを自作のC# アプリから利用したいと考えています。
そのままWindows向けにビルドされたFFmpegのDLLをC#側から直接参照するのは(マーシャリング周りの)勝手がよくないので、利用するFFmpegの処理だけをまとめてC++で書いてDLL化してしまい、そこをC#側から叩くという方針です。

<C#アプリ> - <C++ DLL> - <FFmpeg API DLL>

のようなイメージです。

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

こちらを参考に進めました。

さて、まずはWindows向けにビルドされたFFmpegの.dllや.libやヘッダファイルをこちらから落としまして、Visual Studioで新規作成したプロジェクトにそれらを読み込む設定をし、該当処理を書き、dllexportを書き、"ffmpegwrapper.dll"としてビルドしました。
そののちC#側から

Csharp

1 2 private void ExecuteInternal() 3 { 4 try 5 { 6 Console.WriteLine( decode_video()); 7 }catch (Exception e) 8 { 9 MessageBox.Show(e.Message); 10 } 11 } 12 [DllImport("ffmpegwrapper.dll")] 13 static extern int decode_video();

のようにして呼び出したところ、DllNotFoundExceptionが投げられて

DLL `ffmpegwrapper.dll`が読み込めません:指定されたプロシージャが見つかりません。(HRESULT からの例外:0x8007007F)

と返されて実行されませんでした。ffmpegwrapper.dllは実行ファイルの場所に配置しております。
試しにC++ DLL(ffmpegwrapper.dll)側で、FFmpeg APIを呼び出す部分をすべて削除し、intを返すだけの関数をエクスポートしてC#から呼び出したところ、問題なく呼び出されました。しかしそのままもう一度FFmpeg APIを呼び出す関数を記述すると、たとえC#側でその関数を呼び出さずとも、DLL読み込みでエラーが発生することが分かりました。

ffmpegwrapper.dllがFFmpeg APIのDLLを参照/リンクする際に何らかの不具合が発生していると考え、DLLの依存情報を閲覧することができるDependency Walkerでffmpegwrapper.dllを見てみたところ、以下の様に表示されました。

イメージ説明
イメージ説明

avcodec-58.dll, avutil-56.dllがFFmpeg APIのDLLです。左ペインにはffmpegwraper.dllが参照するDLLの一覧があり、右ペインには一覧から選択したDLL内でffmpegwrapper.dllが依存している関数の一覧が表示されています。そのうち緑色に表示されているのが、該当関数がDLL内に存在しているもので、赤色のものは該当関数がDLL内に見つからないことを示しています。
きちんとビルドされたDLLであればすべて緑色に表示されるはずです。

しかしなぜかavcodec-58.dllの関数の参照がavutil-56.dll側への参照としても登録されてしまっており、またavutil-56.dllの関数の参照がavcodec-58.dll側への参照としても登録されてしまっており、その結果双方で赤色の表示が出てしまっているようです。

FFmpeg APIの.dll, .lib, .hをC++プロジェクトに登録する際の設定が間違っているのでしょうか?仮に間違えていたとして、正常にビルドが通っているのにこのようなDLLが生成されてしまうことがあるのでしょうか?

C++の経験があまりないので根本的な勘違いをしてるのかもしれませんが、お分かりの方がいらっしゃったら対処法を教えてください。

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

Visual Studio 2015
.NET Framework 4.5.2
FFmpeg Builds for Windows by Zeranoe 20180211-8b154cb-win64

Visual Studio(C++ DLL)のプロジェクトの作成設定は以下の通りです。
・Win32 コンソールアプリケーション、DLL、シンボルをエクスポート

FFmpeg APIの.dll, .lib, .hを読み込むためにした設定は以下の通りです。
プロジェクトの「プロパティ ページ」にて
・[C/C++] > [全般] > [追加のインクルード ディレクトリ] に.hファイルが格納されたディレクトリを指定
・[リンカー] > [全般] > [追加のライブラリ ディレクトリ] に.libと.dllが格納されたディレクトリを指定
・[リンカー] > [入力] > [追加の依存ファイル] にすべての.libのファイル名を指定

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

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

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

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

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

KoichiSugiyama

2018/02/13 13:34 編集

質問に書かれた内容だけを見ると、そもそもFFmpegのAPIを呼び出すこと自体が上手くいっていないように思えます。C++で作成したアプリケーションなどからAPIを呼び出すことは問題なくできているのでしょうか? FFmpegがほかのライブラリに依存していて、それらが見つからないというようなことはないでしょうか。そのあたりを確認してみてください。
guest

回答2

0

FFmpegのバージョンを少し差し戻したところ正常にリンクできました。
回答してくださった方々、ありがとうございました!

投稿2018/02/18 10:08

ruccho

総合スコア285

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

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

0

ベストアンサー

こんにちは。
エラー8007007Fは、私の場合はほとんど、次のような理由で発生しましたので参考にしてください。

1.FFMPEG DLLファイルが実行フォルダにない。
2. ビルドに利用した.h、もしくは.libファイルのヴァージョンと.dllファイルのヴァージョンが異なる。

8割以上これ二つでした。
もちろんエラー8007007Fの原因はいろいろありますので断定的には言えません(2割の原因を診断するためにはプロジェクト全体の構造を見る必要があります)しかし、理由を一言でまとめるとこれです。

「DLLファイルが正しくない」

では。

投稿2018/02/14 02:41

編集2018/02/14 02:43
gazette2

総合スコア179

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問