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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
purin52002
記事: 235
登録日時: 4年前
連絡を取る:

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

#1

投稿記事 by purin52002 » 3年前

こんにちは

「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([ファイル名])
みたいな感じのものです。(が、これだと””がないため怒られてしまいます。)

何かいい方法がありましたらご教授ください<(_ _)>
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

アバター
purin52002
記事: 235
登録日時: 4年前
連絡を取る:

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

#2

投稿記事 by purin52002 » 3年前

こんばんは

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

コード:

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

以下、参考url
https://www.slideshare.net/kinukox/cc-55863339
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

かずま

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

#3

投稿記事 by かずま » 3年前

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

アバター
purin52002
記事: 235
登録日時: 4年前
連絡を取る:

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

#4

投稿記事 by purin52002 » 3年前

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だけでインクルードディレクトリを変更できるような方法があればぜひこちらを採用したいです。
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

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

#5

投稿記事 by ISLe » 3年前

開発環境に依存する内容なので開発環境が分からないと回答のしようがないです。

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

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

アバター
purin52002
記事: 235
登録日時: 4年前
連絡を取る:

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

#6

投稿記事 by purin52002 » 3年前

たくさんの人に回答をもらえてうれしいです\(^p^)/

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

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

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

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

おそらくこのエラーについてはスレチになると思うので、これで解決とします。
かずまさん、ISLeさん、ありがとうございました。<(_ _)>
オフトピック
ISLe さんが書きました: ファイル名の干渉を気にするなら、ライブラリ単位でプロジェクトを分けてプロジェクトのプロパティを設定するほうがより自然な形だと思います。
プロジェクトの使い方がまだよくわかっていないため、たぶんその方法はできないですorz
プロジェクトについて別トピを立てるつもりですので、よろしかったらそちらでご教授願います<(_ _)>
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

hoge

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

#7

投稿記事 by hoge » 3年前

purin52002 さんが書きました:実はNo.2の方法を試してみたところ、includeはできたのですがエラーが出てしまいました。
includeできたの??うまくいくようには見えないんだが。
↓これなら多分、大丈夫

コード:

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

アバター
purin52002
記事: 235
登録日時: 4年前
連絡を取る:

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

#8

投稿記事 by purin52002 » 3年前

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

とりあえずマクロにマクロ使うときは複数回挟めばいいってわけですね。^^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

返信

“C言語何でも質問掲示板” へ戻る