2017-09-07 6 views
2

私は(基本)C++プロジェクトを持っている:実行可能example.cppdata/ディレクトリからいくつかのデータファイルを使用しC++ Bazelプロジェクト

├── bin 
│   ├── BUILD 
│   ├── example.cpp 
├── data 
│   └── someData.txt 
└── WORKSPACE 

#include <fstream> 
#include <iostream> 

int main() 
{ 
    std::ifstream in("data/someData.txt"); 

    if (!in) 
    { 
    std::cerr << "Can not open file!"; 
    return EXIT_FAILURE; 
    } 

    std::string message; 

    if (!(in >> message)) 
    { 
    std::cerr << "Can not read file content!"; 
    return EXIT_FAILURE; 
    } 

    std::cout << message << std::endl; 

    return EXIT_SUCCESS; 
} 

をマイBazelの設定は最小です:

  • WORKSPACE:空のファイル
  • ビン/ビルドがcc_binary(name = "example",srcs = ["example.cpp"])
  • データ/ someData.txtは:

問題はBazelは特別な場所にすべてのこれらのファイルを移動していることであるHello_world!行が含まれています。特有 executablで

. 
├── bazel-Bazel_with_Data -> ... 
├── bazel-bin -> ... 
├── bazel-genfiles -> ... 
├── bazel-out -> ... 
├── bazel-testlogs -> ... 

bazel run bin:example 

が印刷されます:

INFO: Analysed target //bin:example (0 packages loaded). 
INFO: Found 1 target... 
Target //bin:example up-to-date: 
    bazel-bin/bin/example 
INFO: Elapsed time: 0.101s, Critical Path: 0.00s 
INFO: Build completed successfully, 1 total action 

INFO: Running command line: bazel-bin/bin/example 
Can not open file!ERROR: Non-zero return code '1' from command: Process exited with status 1 

質問がこれをどのように管理することであるeがデータ/ someData.txtファイルが見つかりませんでしょうか?

は私がデータ/ someData.txtファイルを見つけることができるようにするために実行可能をしたいです。

答えて

0

注意:この解決策はWindowsでは動作しないようです(コメントを参照)。

1つのデータファイルをエクスポートする必要がありますかを定義データディレクトリ内の余分なBUILDファイルを作成する必要があります。プロジェクト構造は以下のようになります。

exports_files(["someData.txt"]) 

そしてのbin/ファイルをビルドがsomeDataがを追加するように変更されます。

├── bin 
│   ├── BUILD 
│   ├── example.cpp 
├── data 
│   ├── BUILD 
│   └── someData.txt 
└── WORKSPACE 

この新しいデータは/ファイルをビルドです。TXT依存:あなたが実行している場合今

cc_binary(
    name = "example", 
    srcs = ["example.cpp"], 
    data = ["//data:someData.txt"], 
) 

bazel run bin:example 

あなたが取得する必要があります。

INFO: Analysed target //bin:example (2 packages loaded). 
INFO: Found 1 target... 
Target //bin:example up-to-date: 
    bazel-bin/bin/example 
INFO: Elapsed time: 0.144s, Critical Path: 0.01s 
INFO: Build completed successfully, 3 total actions 

INFO: Running command line: bazel-bin/bin/example 
Hello_world! 

実行ファイルが データ/ someData.txtを発見したことを意味しますファイルを開き、その内容を印刷します。

はまた、あなたはあなたがこのGitHub repoからこのノートを再現することができ

cc_test(...,data =["//data:someData.txt"],) 

ユニットテストに同じスキームを使用できることに注意してください。

+0

GitHubリポジトリからサンプルを実行するために、* WINDOWS *で実行されるbazelを使用しようとしましたか? 試してみると、https://github.com/vincent-picaud/Bazel_with_Data/blob/master/bin/example.cpp#L6で開かれたストリームは失敗します。 しかし、Linuxでプロジェクトを実行しているbazelは機能します。 – thinlizzy

+0

@thinlizzyフィードバックに感謝します。私はWindowsの下でそれをテストしていません。それが動作しない場合、私は私のポストを更新します。 –

+0

@thinlizzy多分それはちょうどパス "data/someData.txt"です。私は、Windowsは "data \ someData.txt"を期待していると思います。試しましたか? (私はWindowsにアクセスできない、私はLinux上でしか動かない) –

関連する問題