Visual Studio C++ の NuGet で #include のパスが通らないの何なんだぜ、調べようぜ☆(^~^)?

あわちょ☆(^~^) 公開下書き

2020-12-13 sun

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 C言語 は OSの入ってないハード 寄りのプログラム言語という居場所を持ってるのが長所なんで、 オートマチック車ではなく マニュアル車 みたいな趣がむしろ長所であり
Python, JavaScript, Rust言語などにある モジュール・システム という高級言語に付いているやつが無いのは 原理的に理解できるだろう☆」

#include <hoge.h>
#include "fuga.h"

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 三角括弧とダブルクォーテーションで何が違うのかとか あるあるネタ だが パスの探し方が違うだけで 知ったところで別に嬉しくない……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そして C++言語 は高級言語のくせに 長らく モジュール・システム は付いていない☆
そんなだから ライブラリを参照するのにはトラウマがある☆
NuGet とかで パッケージをインストール すると つまづく☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 #include は欠陥品なのでは☆ 触って3日目には なんかこいつおかしいな、と気づくだろ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 35年ぐらい 見て見ぬふりをしている人たちが居るのよ。伝統だから」

20201213cpp1a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 脱線してると1記事書いてしまうので 本題を進めよう☆
単純に 機械学習のパッケージを NuGet でインストールしたのに #include <onnxruntime_c_api.h>が効くときと、効かないときがあるの
何でなの、だぜ☆」

20201213cpp2a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 最近ではもう ディレクトリ名やプロジェクト名を 深く考えるのが嫌になって Git Hub のローカル・リポジトリ用のディレクトリに
タスケテ何とかマン、ハロー、ナントカ☆! とか名前を付けて 作成☆」

20201213cpp3a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ わたしが今作ったのは プロジェクト で、
ソリューション というのは 勝手に作られたものだということに 注意されたい☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 何のこっちゃ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 コンピューターの勉強をしたいのに、やっていたことは Microsoft 製品の勉強だった、 ということが 無いようにしたい わね」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Microsoft の ビルゲイツというやつが 研究所の中ではなく 民間に普及させて市場を取るための商品としてのコンピューターに BASIC というプログラム言語を
作って与えて以降、コンピューターが普及するほど Microsoft も広がるという 稲からみた人類 みたいな増え方をしたので
民間のコンピューターの勉強 = Microsoftの勉強 というのも 30点ぐらいは 正しい雰囲気だぜ☆」

20201213cpp4a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ で、こういう感じに ディレクトリーが作成されたはずだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ここで ポイントとしては、 Microsoft は ユーザーからのクレームに対応するのはコストだと考えていると思うので、
賛否両論 よりは 賛とも言い難いが我慢できる程度の否 を狙ってデザインしてくる☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 お父んは 作成先のディレクトリー に既存の GitHub ディレクトリーを選べば もっと すっきりしたのでは☆?」

20201213cpp5a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ じゃあ 勝手に作られた *.sln ファイルを右クリックして、好きなテキストエディターで開いてくれだぜ☆」

20201213cpp6a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ なんだか知らんフォーマットだが、プロジェクト・ファイルへの相対パスが書かれているな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 なんで 知られているフォーマットにしないの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 まあ、良く言えば 伝統 なんだろう……☆
伝統って あまりにも管理コストが高くなると 破棄 されるストーリーが待っているので、良くないんだけどな☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ちなみに *.sln ファイルをダブルクリックすると、
Visual Studio が紐づいていて 起動するぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 実行ファイルじゃないのに アプリケーションを起動できるの、 GUI の利便性が産んだ コンピューター体験の統一性の破綻だよな☆」

20201213cpp7a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ じゃあ、プロジェクト・ファイルを テキスト・エディターで開いてみようぜ☆?」

20201213cpp8.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ いっぱい書いてあるが、要は プロジェクト に対して設定したものが並んでるんだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ちなみに プロジェクト・ファイルをダブルクリックしても、 Visual Studio は起動するぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 プロジェクトから ソリューションへの方向には 相対パスなどで紐づいていないのに なんで そんなことが……☆?」

20201213cpp9.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ プロジェクト・ファイルをコピーして、 ソリューションが近くにないところで ダブルクリックしてみようぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 パスツールの実験みたいだ……☆」

20201213cpp10a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ Visual Studio は起動するが、存在しないソリューション・ファイルを指しているぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 いろいろ混乱を生みそうな 利便性 だぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 Visual Studio を起動してから、ソリューション・ファイルを選んで開きましょう!
それが GUI の利便性を享受しない コンピューターの手堅い使い方なのよ」

20201213cpp11a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ じゃあ NuGet を使って Microsoft.ML.OnnxRuntime.DirectML パッケージをインストールしてみようぜ☆?」

20201213cpp12a1.png

KIFUWARABE_80x100x8_01_Futu.gif
「 ↑ 似たような名前がいっぱいあって 地獄だ……☆」

20201213cpp13a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ .sln ファイルと同じディレクトリーに package ディレクトリーを作成して、
そこへ 欲しいパッケージ、そして 欲しいパッケージを使うために必要なパッケージを ダウンロードしてくれたようだな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 パッケージ・マネージャー なんて今どきのモダンなプログラム言語には トップ・ディレクトリーからアクセスできるぐらい
重要な機能なのに [ツール] - [NuGet パッケージ マネージャー] - [ソリューションの NuGet パッケージの管理] と 3回クリックしなきゃいけないの、
イケてなくない?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Microsoft は Windows製品 を売るとともに、 Windowsの基本操作 という 文化 も売っている☆
その文化を変える権限を持っているのは Microsoft社員のうちの誰かを考えてみろだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 コンピューターの使い方を覚え、それを飯のタネにしている 全国の Windows ファンがそれを許さないだろう☆」

20201213cpp14.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ インストール前と、インストール後で変わるのは、
.sln ファイルと同じディレクトリーに package ディレクトリーができたことと、
パッケージ ファイルの方に 変更と packages.config ファイルが追加されたということだぜ☆
もちろん OS の深い所に何か変化があったら 気づかないが……☆」

20201213cpp15.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 変化と言えば 相対パスが追加されたことと……☆」

20201213cpp16.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ パッケージが見つからなかった時のエラーメッセージと、その条件がコーディングされてることと……☆」

20201213cpp17.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ packages.config をソリューション・エクスプローラーで見えるようにすることだな☆」

20201213cpp18a1.png

#include "onnxruntime_cxx_api.h"
// #include <onnxruntime_cxx_api.h>

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 初回は 読込に十数秒かかるようになってしまったが、 ダブルクォーテーションでも三角括弧でも エラーは無く動くぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 今の 初回実行時だけのその遅さ は、スペックの高いマシンじゃないと気づかなくない?」

KIFUWARABE_80x100x8_01_Futu.gif
「 何が自動生成されたのか、調べてみようぜ☆?」

20201213cpp20.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ じゃあ一旦、インストールしたパッケージを、アンインストールしてみるぜ☆」

20201213cpp21.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ packages.config の中身がだいぶ減ったが、
アンインストールしたのは Microsoft.ML.OnnxRuntime.DirectML パッケージであって、
それが依存していた Microsoft.AI.DirectML を名指しでアンインストールしたわけではないので、記述が残ってるのかだぜ☆?
だとしたら 依存性を追いかける機能がそれほど優れていない☆?」

20201213cpp19a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ また、プロジェクト・ファイルに記述されているものも消えていないが、条件文によって非表示にはされるみたいだな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 網の目の 依存関係を 全部記述していたら 指数関数的にオーバーヘッドが増えてくから、
網の目、またはツリー構造の 葉の数だけ書いて 枝は書かずに 条件文付けて終わりで 楽してんじゃないの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そんな バッド・ノウハウ 溜まってるとしたら Microsoft らしいよな☆」

20201213cpp22.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ こうやって 丸ごとコピーを 取り置きしながら 差分を調べることで 1ステップで何が起こるのかを確認していくんだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 とろくさ……☆」

20201213cpp23.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ packages.config ファイルは もっといろいろパッケージに与えた設定とか書かれるんだが、
インストール直後は こんな感じで ちょびっと だぜ☆」

20201213cpp24.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 初回起動時は デバッグ用のデータベースが作られているから遅いだけか……☆?
packages ディレクトリーに変化はなし☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 packages ディレクトリーの見所を教えてくれだぜ☆」

20201213cpp25.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ .props.targets ファイルはどちらも XML形式だぜ☆」

20201213cpp26.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ .targets の方は、CPUの構成が違う時にエラーメッセージを表示するテンプレートなのだろう……☆」

20201213cpp27a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ .props の方は、 環境変数のPATHの書き方に似ていて パスを追加したり☆、」

20201213cpp27a2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ CPUの構成によって呼び出す .dll を変えているのだろう……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 そのパスの構成が、何かのタイミングで 全部 オジャン になることがあるんじゃないの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 故意に オジャン にする方法はいくらでもあるが、 不意に オジャン にしてしまうのが 何をしたからなのかが知りたいんだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 そんなん オジャンにしてるやつを観察 するしかないぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ、再現するまで しばらく保留な☆」

2020-12-14 mon

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 古ーいプロジェクトから プロジェクトのアップグレード した時と、 プロジェクトの設定をGUIで操作したとき に プロパティシートが更新されることがあって、
%(AdditionalIncludeDirectories) = "%(AdditionalIncludeDirectories);追加するpath" としなければならないところが
%(AdditionalIncludeDirectories) = "" になってしまうことがあるそうよ」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 1990年代から 口を酸っぱく書かれて読んでいた パスの通し方の間違え方、わらう☆」

<書きかけ>

何度でもクリック!→

むずでょ@きふわらべ第29回世界コンピューター将棋選手権一次予選36位

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

むずでょ@きふわらべ第29回世界コンピューター将棋選手権一次予選36位 の最近の記事