none
DLLの作成例を試したが問題がある RRS feed

  • 質問

  • はじめて使うVisualStudio2019コミュニティで、ある機能のDLLを作成したく、マイクロソフトのページの
    チュートリアル: 独自のダイナミック リンク ライブラリを作成して使用する (C++)
    https://docs.microsoft.com/ja-jp/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=vs-2019
    を参照して、手順に従い進めましたが、
    ”DLL に実装を追加するには”の項目から
    ”エディターで、MathLibrary.cpp ファイルの内容を次のコードに置き換えます。”
    としたところ、先頭の下記部分の
    // MathLibrary.cpp : Defines the exported functions for the DLL.
    #include "stdafx.h" // use pch.h in Visual Studio 2019
    #include <utility>
    #include <limits.h>
    #include "MathLibrary.h"
    の所で下記のエラーが出ます。
    重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
    エラー (アクティブ) E1696 ソース ファイルを開けません "stdafx.h" MathLibrary C:\Users\qhtsi\source\repos\MathLibrary\MathLibrary\MathLibrary.cpp 2 
    エラー C1010  プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "pch.h"' をソースに追加しましたか? MathLibrary C:\Users\qhtsi\source\repos\MathLibrary\MathLibrary\MathLibrary.cpp 57 

    stdafxが見つからないということですが、これを解決する方法がわかりません。それぞれの.cppファイルのプロパティのプリコンパイルヘッダーは使用するになっています。
    プリコンパイルヘッダを使用しない方法もあるようですが、そうではなく、できればstdafx.hを所定の場所に格納する方法で解決したいと思います。
    どのようにすればよいでしょうか。stdafx.hを探して、このフォルダにコピーするのでしょうか。どこにあるかもわかりません。
    サンプルコードをコピーしただけなのに、なぜこのようなサンプルコードになっているかも知りたいところです。

    VisualStadio自体は初めてです。以前からtryしていますが成功していません。

    なお32ビット用のDLLです。windows10です。Vs2019のバージョンは16.2.2です。



    2019年8月18日 14:10

回答

  • 今更ですが、返していなかったので…。

    それらのエラーメッセージは見ましたが意味がよくわかりませんでした。
    1.#include "stdafx.h" // use pch.h in Visual Studio 2019
    この意味は
     stdafx.hをvs2019では(pch.hを使うので)pch.h中でstdafx.hを使う(それがあることを期待)がそのstdafx.hが見つからないと言うことと思いました。
    なので、stdafx.hをしかるべき場所に置かねばならないと思いました。

    「Visual Studio 2019 では、#include "stdafx.h" の代わりに、#include "pch.h" と書いてね」(意訳)です。
    Visual Studio 2019 では「stdafx.h」はありませんし、その存在は忘れてしまって良いです。
    ”「stdafx.h」と書くべきところだったところは、すべて「pch.h」と書く、名前が変わった”がすべてです。

    > Visual Studio で新しいプロジェクトを作成すると、 pchという名前のプリコンパイル済みヘッダーファイルがプロジェクトに追加されます。 
    > (Visual Studio 2017 以前では、ファイルはstdafx.hと呼ばれていました)
    https://docs.microsoft.com/ja-jp/cpp/build/creating-precompiled-header-files?view=vs-2019 より

    2.「#include "pch.h" をソースに追加しましたか?」
    サンプルコードを使っただけなので、意図的に何かを変更したとは思わないので、意味がわかりませんでした。
    で、どのように解決すればよいかよくわからなかったのです。

    新規作成した直後のプロジェクトでは多くの場合、「プリコンパイル済みヘッダーを使用する」設定になっています。
    それなのに、プロコンパイル済みヘッダー(今回の場合は pch.h)をインクルードする記述が見つからなかったので、エラーとなり、ヒントとして「プリコンパイル済みヘッダーを使う用に設定しているのだから、#include "pch.h" を書きましょう!」(意訳)と表示しています。

    最近の日本語文言や日本語ドキュメントは、英語からの直訳っぽいものや機械翻訳が中心なので、字面通りに捉えると誤ることが多いです。
    そして、C++ は C# などよりも難しい界隈であり、かつ 2019 から突如 pch.h に変わったこともあるので、サンプルや解説ページを見ているだけではうまく進められない、そういった難しいところにチャレンジされているということは認識しておいてください。

    • 回答としてマーク sige2 2019年10月27日 9:00
    2019年10月26日 22:39
    モデレータ

すべての返信

  • #include "stdafx.h" // use pch.h in Visual Studio 2019
    初心者には不親切かもしれませんが、このコメント(太字で強調しました)に書かれている通りではないでしょうか?
    「Visual Studio 2019 なら(stdafx.h ではなく)、pch.h を使う」という意味ですし、エラーメッセージも「#include "pch.h" をソースに追加しましたか?」というように、記載漏れを疑うヒントが出ていますね。
    2019年8月18日 14:21
    モデレータ
  • 早速のご返事ありがとうございます。
    それらのエラーメッセージは見ましたが意味がよくわかりませんでした。
    1.#include "stdafx.h" // use pch.h in Visual Studio 2019
    この意味は
     stdafx.hをvs2019では(pch.hを使うので)pch.h中でstdafx.hを使う(それがあることを期待)がそのstdafx.hが見つからないと言うことと思いました。
    なので、stdafx.hをしかるべき場所に置かねばならないと思いました。
    2.「#include "pch.h" をソースに追加しましたか?」
    サンプルコードを使っただけなので、意図的に何かを変更したとは思わないので、意味がわかりませんでした。
    で、どのように解決すればよいかよくわからなかったのです。

    ネットでの調べなどでは、stdafx.hは標準的に(必ず使う?)使うヘッダをまとめておく(まとめられている?)もので、pch.hは毎回使うヘッダのコンパイル時間を短縮するためにプリコンパイルしておいてコンパイル時間を短縮するために使うことにあると思いました。。
    似たようなエラーの場合プリコンパイルヘッダを使用しない方法もあるようですが、ここでは標準的に見える使う方法でやってみたいとの思いもあります。

    よろしくご教示をお願いします。


    2019年8月18日 23:05
  • Azulenさんのご回答ではその当時わかりませんでした。(警告の意味は誤解していました)

    現在でもpch.hは正確には理解できていませんが、なぜか動くようになっています。

    消化不良ですが、このスレッドは閉じます。

    2019年10月26日 9:42
  • 今更ですが、返していなかったので…。

    それらのエラーメッセージは見ましたが意味がよくわかりませんでした。
    1.#include "stdafx.h" // use pch.h in Visual Studio 2019
    この意味は
     stdafx.hをvs2019では(pch.hを使うので)pch.h中でstdafx.hを使う(それがあることを期待)がそのstdafx.hが見つからないと言うことと思いました。
    なので、stdafx.hをしかるべき場所に置かねばならないと思いました。

    「Visual Studio 2019 では、#include "stdafx.h" の代わりに、#include "pch.h" と書いてね」(意訳)です。
    Visual Studio 2019 では「stdafx.h」はありませんし、その存在は忘れてしまって良いです。
    ”「stdafx.h」と書くべきところだったところは、すべて「pch.h」と書く、名前が変わった”がすべてです。

    > Visual Studio で新しいプロジェクトを作成すると、 pchという名前のプリコンパイル済みヘッダーファイルがプロジェクトに追加されます。 
    > (Visual Studio 2017 以前では、ファイルはstdafx.hと呼ばれていました)
    https://docs.microsoft.com/ja-jp/cpp/build/creating-precompiled-header-files?view=vs-2019 より

    2.「#include "pch.h" をソースに追加しましたか?」
    サンプルコードを使っただけなので、意図的に何かを変更したとは思わないので、意味がわかりませんでした。
    で、どのように解決すればよいかよくわからなかったのです。

    新規作成した直後のプロジェクトでは多くの場合、「プリコンパイル済みヘッダーを使用する」設定になっています。
    それなのに、プロコンパイル済みヘッダー(今回の場合は pch.h)をインクルードする記述が見つからなかったので、エラーとなり、ヒントとして「プリコンパイル済みヘッダーを使う用に設定しているのだから、#include "pch.h" を書きましょう!」(意訳)と表示しています。

    最近の日本語文言や日本語ドキュメントは、英語からの直訳っぽいものや機械翻訳が中心なので、字面通りに捉えると誤ることが多いです。
    そして、C++ は C# などよりも難しい界隈であり、かつ 2019 から突如 pch.h に変わったこともあるので、サンプルや解説ページを見ているだけではうまく進められない、そういった難しいところにチャレンジされているということは認識しておいてください。

    • 回答としてマーク sige2 2019年10月27日 9:00
    2019年10月26日 22:39
    モデレータ
  • 丁寧なごへんじありがとうございます。

    pch.hを使う設定であるのに、それが見つからないのでエラーになることはわかりました。

    vs2019より前は、stdafx.hを標準的に使う前提となっているが、それがvs2019からはpch.hに変わったということですね。

    今一つわからないことは、pch.hを使わない設定になっている場合であれば、実際にpch.hを置かなくてもよいのでしょうか。pch.hがなければまずいケースは無いのでしょうか。予想としては、それに代わる必要なヘッダを個別に定義するとか。

    また、pch.hはあるが、その中身にプリコンパイルしたいヘッダが無ければ、その中身は空白で良いのですか。

    一切ヘッダのプリコンパイルの必要がなければ(開発サイズが小さいので)、意味からしてなくても良いわけですね。と思っていました。

    VS2019が生成する、ひな形は確かpch.hは空白だったように思います(今は未確認)。

    わかりやすい予想する使い方として、pch.hは使わない。でよいでしょうか。そうすると、以前には必要であった(?ですが)stdafx.hとの関連が疑問になります。

    VS2019の初級者は、VSにあるいろんな標準コードを使う場合、どんなヘッダが必要なのかがわかりにくい所です。そのようなわかりにくさを、何か標準コードを使えば、それに必要なヘッダが何かに自動的に組み込まれれば良いのになと、以前から思っています。

    それで昔からのC(c++でなく)を引きずりがちな気持ちになります。

    グダグダのべてすみません。

    2019年10月27日 9:22
  • 小生の希望する結論として、

    小規模な場合、pch.hは使わない設定とし、それを使わない。

    また、もしサンプルコードにpch.hがあれば、その中身を自分のコードにヘッダファイルとしてペーストする。中身が空であればもちろん削除する。もしstdafx.hであれば同様に中身をペーストしておく。

    でよいでしょうか。

    2019年10月27日 9:42
  • 「プリコンパイル済みヘッダー」でぐぐれば、いろいろと説明しているページがあるので、まずは調べましょう&読んでみましょう。

    結論から言えば、使わない設定とすることで差し障りがないならそうすれば良いです。
    ただし、それによってビルド時間が長くなることを受容する前提ですが。

    2019年10月27日 12:56
    モデレータ
  • vs2019で有効なincludeの扱い方でも答えましたが、何を#includeすべきかを決定するのは開発者の責任であり、Visual Studioが何かを要求するわけではありません。pch.hやstdafx.hを使いたければ使う、それだけであり、pch.hが何かを提供するわけではありません。

    なお、何を#includeすればよいのか分かりづらいというのはその通りですが、各種ドキュメントにはそれぞれ必要となるヘッダーが明記されています。std::vectorであれば「ヘッダ<vector>で定義」と記載がありますし、MessageBoxであればページ末尾に「Header winuser.h (include Windows.h)」とあります。記述に従うだけの話でもあります。

    なお、C++20ではモジュール機能が導入されます。#includeよりは分かりやすくなりますがそれでもimportが必要ということで大差ありません。Visual Studio 2019でもexperimentalとして提供されているため試すこともできます。

    2019年10月28日 0:05
  • 佐祐理様

    小生は開発者でなく、たんなる趣味で必要に応じプログラムを作っているだけです。延経験は長いですが、なかなかプログラム言語によっては、自由に操れるようにはなかなかなれません。

    そのようなものにとって、開発者の責任であると言われましても当惑するばかりです。

    ”pch.hが何かを提供するわけではありません。” これだけで十分であります。 わかりました。で小生の希望する結論でよさそうですね。

    Azulenさま

    もちろんの不十分ながら、いくつかそれまでに検索しています。小生の希望的結論もそれを参考にした部分もあります。

    希望的結論でよいこともわかりました。

    いろいろありがとうございました。今後ともよろしくお願いします。

    2019年10月28日 13:03
  • すこし気になるのでコメントします。
    文意を吟味すれば「開発者」が単なる「操作する者」を意図していることがわかります。
    プロフェッショナルを意図したものではないと思います。

    さて、最初にプリコンパイルヘッダーの仕組みが導入された当時、
    自分も似たようなメッセージが出て、小一時間考え込みました。
    コンパイラはプロが使う道具なのであまり親切には作られていません。
    この辺りは慣れが必要なのかもしれません。

    最後に、原理上当たり前なのですが、一般に既存のサンプルコードは最新のコンパイラより古いです。
    従って、学ぶのが目的の場合には最新版を使用するのは優れた選択とは言えないかもしれません。
    2019年10月29日 1:48