यहां C++ प्रोजेक्ट बनाने के लिए, इस्तेमाल किए जाने वाले कुछ सबसे आम उदाहरण दिए गए हैं पेश है. अगर आपने पहले से ऐसा नहीं किया है, तो C++ का इस्तेमाल करके शुरुआत करें ट्यूटोरियल को पूरा करके, Baज़र के साथ प्रोजेक्ट शेयर करते हैं Babel के बारे में जानकारी: C++ प्रोजेक्ट बनाएं.
cc_library और hdrs हेडर फ़ाइलों के बारे में जानकारी पाने के लिए, देखें cc_library शामिल होंगे.
टारगेट में कई फ़ाइलें शामिल करना
आप एक ही टारगेट में कई फ़ाइलों को शामिल कर सकते हैं ग्लोब. उदाहरण के लिए:
cc_library(
name = "build-all-the-files",
srcs = glob(["*.cc"]),
hdrs = glob(["*.h"]),
)
इस टारगेट के साथ, Basel को इसमें मिलने वाली सभी .cc
और .h
फ़ाइलें बनाने में
BUILD
फ़ाइल के जैसी डायरेक्ट्री, जिसमें यह लक्ष्य है (इनको छोड़कर
सबडायरेक्ट्री).
ट्रांज़िट में शामिल हैं
अगर किसी फ़ाइल में हेडर है, तो उस फ़ाइल के सोर्स के तौर पर मौजूद कोई भी नियम (यानी,
srcs
, hdrs
या textual_hdrs
एट्रिब्यूट में यह फ़ाइल मौजूद होनी चाहिए)
शामिल किए गए हेडर की लाइब्रेरी के नियम पर निर्भर होता है. इसके उलट, सिर्फ़ डायरेक्ट
डिपेंडेंसी को डिपेंडेंसी के तौर पर तय करना चाहिए. उदाहरण के लिए,
sandwich.h
में bread.h
और bread.h
में flour.h
शामिल है. sandwich.h
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
flour.h
(कौन अपने सैंडविच में आटा चाहिए?) शामिल नहीं करता, इसलिए BUILD
फ़ाइल इस तरह दिखेगी:
cc_library(
name = "sandwich",
srcs = ["sandwich.cc"],
hdrs = ["sandwich.h"],
deps = [":bread"],
)
cc_library(
name = "bread",
srcs = ["bread.cc"],
hdrs = ["bread.h"],
deps = [":flour"],
)
cc_library(
name = "flour",
srcs = ["flour.cc"],
hdrs = ["flour.h"],
)
यहां sandwich
लाइब्रेरी, bread
लाइब्रेरी पर निर्भर करती है, जो
flour
लाइब्रेरी में.
शामिल किए गए पाथ जोड़ना
कभी-कभी आप फ़ाइल फ़ोल्डर में पाथ शामिल नहीं कर सकते या नहीं करना चाहते रूट डालें. मौजूदा लाइब्रेरी में पहले से ही एक इन्क्लूड डायरेक्ट्री मौजूद हो सकती है, जिसमें इसके पाथ से मैच करें. उदाहरण के लिए, मान लें कि आपके पास डायरेक्ट्री स्ट्रक्चर:
└── my-project
├── legacy
│ └── some_lib
│ ├── BUILD
│ ├── include
│ │ └── some_lib.h
│ └── some_lib.cc
└── MODULE.bazel
बेज़ल some_lib.h
को इसमें शामिल किए जाने की उम्मीद करेगा
legacy/some_lib/include/some_lib.h
, लेकिन मान लें कि some_lib.cc
में शामिल है
"some_lib.h"
. उसमें पाथ शामिल करने के लिए,
legacy/some_lib/BUILD
को यह बताना होगा कि some_lib/include
डायरेक्ट्री एक शामिल डायरेक्ट्री है:
cc_library(
name = "some_lib",
srcs = ["some_lib.cc"],
hdrs = ["include/some_lib.h"],
copts = ["-Ilegacy/some_lib/include"],
)
यह खास तौर पर बाहरी डिपेंडेंसी के लिए काम आता है, क्योंकि उनकी हेडर फ़ाइलें ऐसा होती हैं
दूसरे मामलों में, प्रीफ़िक्स /
के साथ शामिल किया जाना चाहिए.
बाहरी लाइब्रेरी शामिल करें
मान लें कि आप Google Test का इस्तेमाल कर रहे हैं
{: .external}.
इस पर डिपेंडेंसी जोड़ने के लिए, MODULE.bazel
फ़ाइल में जाएं
Google Test डाउनलोड करें और इसे अपने रिपॉज़िटरी में उपलब्ध कराएं:
bazel_dep(name = "googletest", version = "1.15.2")
C++ टेस्ट लिखना और चलाना
उदाहरण के लिए, आपके पास जांच के लिए ./test/hello-test.cc
बनाने का विकल्प है, जैसे:
#include "gtest/gtest.h"
#include "main/hello-greet.h"
TEST(HelloTest, GetGreet) {
EXPECT_EQ(get_greet("Bazel"), "Hello Bazel");
}
इसके बाद, जांच करने के लिए ./test/BUILD
फ़ाइल बनाएं:
cc_test(
name = "hello-test",
srcs = ["hello-test.cc"],
copts = [
"-Iexternal/gtest/googletest/include",
"-Iexternal/gtest/googletest",
],
deps = [
"@googletest//:main",
"//main:hello-greet",
],
)
hello-greet
को hello-test
लोगों को दिखाने के लिए, आपको यह जानकारी जोड़नी होगी
./main/BUILD
के visibility
एट्रिब्यूट के लिए "//test:__pkg__",
.
अब जांच करने के लिए, bazel test
का इस्तेमाल किया जा सकता है.
bazel test test:hello-test
इससे यह आउटपुट मिलता है:
INFO: Found 1 test target...
Target //test:hello-test up-to-date:
bazel-bin/test/hello-test
INFO: Elapsed time: 4.497s, Critical Path: 2.53s
//test:hello-test PASSED in 0.3s
Executed 1 out of 1 tests: 1 test passes.
पहले से कंपाइल की गई लाइब्रेरी पर डिपेंडेंसी जोड़ना
अगर आप ऐसी लाइब्रेरी का इस्तेमाल करना चाहते हैं जिसका आपके पास सिर्फ़ कंपाइल किया गया वर्शन है (इसके लिए
उदाहरण, हेडर और .so
फ़ाइल) को cc_library
नियम में रैप करें:
cc_library(
name = "mylib",
srcs = ["mylib.so"],
hdrs = ["mylib.h"],
)
इस तरह, आपके फ़ाइल फ़ोल्डर में दूसरे C++ टारगेट इस नियम पर निर्भर हो सकते हैं.