ページ 11

[c++]includeファイルを文字列で指定

Posted: 2017年6月05日(月) 14:56
by purin52002
こんにちは

「unreal engine 4(以下ue4)」 と 機械学習ライブラリ「dlib」を組み合わせて使おうと思っています。
dlibは基本的にヘッダオンリーなライブラリなのですが、一部のヘッダのみソースファイルも一緒にビルドする必要があります。
(ソースファイルの中では別のソースファイルが(相対パスで)インクルードされており、そのソースファイルの中ではおそらく必要なヘッダファイルがインクルードされている)

私の使おうと思っている機能はソースファイルを必要とするものだったのでue4用のプロジェクトに追加したのですが、ue4用のプロジェクトは独自の設定(?)がされているらしく、
ue4が指定したディレクトリの中にあるファイルしかビルドしてくれないようなのです。(dlibのディレクトリ内にあるソースファイルを追加してもビルドしてくれない)

だからといってソースファイルをue4指定ディレクトリに移すと、パスの関係でうまく動かず、ならばいっそdlibディレクトリごとue4指定ディレクトリに移してもよくわからないエラーが多発してしまいます。

そこで、ソースファイル内でインクルードしているファイルのパスを絶対パスに書き換えてしまおうと思いました。
しかし、結構な量のファイルをインクルードしているため、全て手打ちで入力するのは気が引けます。(ファイル名を間違えたままコピペしたり、ファイルの場所が変わったりする?かも)

[hr]

というわけで、
#include "アドレス/ファイル名"
のアドレス部分を変数(というか共通のもの)にできないかな?という質問です。

今考えているのは

コード:

#define DLIB_DIR [アドレス]/
#define ADD_PATH(file_name) DLIB_DIR#filename

#include ADD_PATH([ファイル名])
みたいな感じのものです。(が、これだと””がないため怒られてしまいます。)

何かいい方法がありましたらご教授ください<(_ _)>

Re: [c++]includeファイルを文字列で指定

Posted: 2017年6月08日(木) 02:07
by purin52002
こんばんは

もしかしたらマクロの連結を使えばうまくいくかもしれません。

コード:

#define DLIB_DIR [アドレス]/
#define ADD_PATH(file_name) DLIB_DIR###filename//こうかな?
 
#include ADD_PATH([ファイル名])
ちょっと自信がないし、まだ試していないのでうまく動いてくれるかはわかりませんが、、、

以下、参考url
https://www.slideshare.net/kinukox/cc-55863339

Re: [c++]includeファイルを文字列で指定

Posted: 2017年6月08日(木) 02:22
by かずま
purin52002 さんが書きました:そこで、ソースファイル内でインクルードしているファイルのパスを絶対パスに書き換えてしまおうと思いました。
しかし、結構な量のファイルをインクルードしているため、全て手打ちで入力するのは気が引けます。(ファイル名を間違えたままコピペしたり、ファイルの場所が変わったりする?かも)
ソースは書き替えずに、コンパイルオプションの -Idir でインクルードディレクトリを指定するのはダメなんですか?

Re: [c++]includeファイルを文字列で指定

Posted: 2017年6月08日(木) 02:44
by purin52002
dlibの中身が

dlib
┣dlib
┃┣all
┃┃┗source.cpp
┃┗etc.
┗etc.

のような構成になっています。

source.cppの中身が

コード:

#include " ../[フォルダ名]/[ファイル名]"
...
のように相対パスでソースファイルをincludeしています。

[hr]

かずまさん

なるほど、インクルードディレクトリの追加というのは考えていませんでした^^;
この場合追加するならdlib/dlib/allのディレクトリになると思うのですが、
source.cpp以外ではallを基準としたincludeをしません。

source.cppだけでallをインクルードディレクトリに追加、みたいなことってできませんかね?

いまのところ
  1. マクロでパスを指定する方法
  2. インクルードディレクトリを追加する方法
の順で試そうかな、と思っているのですが、
source.cppだけでインクルードディレクトリを変更できるような方法があればぜひこちらを採用したいです。

Re: [c++]includeファイルを文字列で指定

Posted: 2017年6月08日(木) 17:44
by ISLe
開発環境に依存する内容なので開発環境が分からないと回答のしようがないです。

Visual Studioであれば、ソースファイルのプロパティで、ソースファイルごとに指定できます。

ファイル名の干渉を気にするなら、ライブラリ単位でプロジェクトを分けてプロジェクトのプロパティを設定するほうがより自然な形だと思います。

Re: [c++]includeファイルを文字列で指定

Posted: 2017年6月08日(木) 23:56
by purin52002
たくさんの人に回答をもらえてうれしいです\(^p^)/

開発環境はvs2017になります。

ソースごとに指定できるのは知りませんでした^^;
(今までプロジェクトごとにしか設定したことなかった)

実はNo.2の方法を試してみたところ、includeはできたのですがエラーが出てしまいました。
ライブラリ内の関数の”{の前のトークンが無効です"みたいなエラーなのですが、正直何がエラーかわかりません^p^
いじったところと言えばマクロを追加して、マクロでインクルードしたぐらいです。

とりあえず明日になったらインクルードディレクトリを追加する方法も試してみたいと思います。
エラーの原因がマクロにあるかどうかを調べてみねば^^;

おそらくこのエラーについてはスレチになると思うので、これで解決とします。
かずまさん、ISLeさん、ありがとうございました。<(_ _)>
オフトピック
ISLe さんが書きました: ファイル名の干渉を気にするなら、ライブラリ単位でプロジェクトを分けてプロジェクトのプロパティを設定するほうがより自然な形だと思います。
プロジェクトの使い方がまだよくわかっていないため、たぶんその方法はできないですorz
プロジェクトについて別トピを立てるつもりですので、よろしかったらそちらでご教授願います<(_ _)>

Re: [c++]includeファイルを文字列で指定

Posted: 2017年6月09日(金) 18:34
by hoge
purin52002 さんが書きました:実はNo.2の方法を試してみたところ、includeはできたのですがエラーが出てしまいました。
includeできたの??うまくいくようには見えないんだが。
↓これなら多分、大丈夫

コード:

#define  DLIB_DIR [アドレス]
#define ADD_PATH2(filename) #filename
#define ADD_PATH(file_name) ADD_PATH2(DLIB_DIR/filename)

Re: [c++]includeファイルを文字列で指定

Posted: 2017年6月09日(金) 19:33
by purin52002
ああ、すいません。追記を忘れていました。
hogeさんの言うとおりマクロを複数回挟むことで解決できました。
どうやらマクロの引数にマクロを渡すとマクロとして展開されないため一度マクロを挟むことでマクロを展開したマクロとして、、、
、、、マクロがゲシュタルト崩壊しました^p^

とりあえずマクロにマクロ使うときは複数回挟めばいいってわけですね。^^