Yaygın C++ Derleme Kullanım Alanları

Sorun bildir Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Burada C++ projeleri oluşturmak için en yaygın kullanım alanlarından bazılarını bulabilirsiniz yardımcı olabilir. Henüz yapmadıysanız C++ derlemeye başlayın. bir projeyi yönetmek için Bazel'e giriş: C++ projesi oluşturma.

cc_library ve hdrs üstbilgisi dosyaları hakkında bilgi için bkz. cc_library öğesini seçin.

Bir hedefe birden fazla dosya ekleme

Birden çok dosyayı tek bir hedefe dahil edebilirsiniz. glob ifadesini yükleyin. Örneğin:

cc_library(
    name = "build-all-the-files",
    srcs = glob(["*.cc"]),
    hdrs = glob(["*.h"]),
)

Bu hedefle Bazel, .cc ve .h bu hedefi içeren BUILD dosyasıyla aynı dizin (hariç tutulan) alt dizinler) için de kullanılabilir.

Geçişli dahil etme özelliğini kullanma

Bir dosyada başlık varsa kaynak olarak bu dosyayı içeren tüm kurallar (yani srcs, hdrs veya textual_hdrs özelliğine eklenmiş olması gerekir) eklenen başlığın kitaplık kuralına bağlıdır. Öte yandan, yalnızca doğrudan bağımlılıklar bağımlılık olarak belirtilmelidir. Örneğin, sandwich.h bread.h içerir, bread.h ise flour.h içerir. sandwich.h. flour.h içermiyor (kim sandviçinde un istiyor?), bu nedenle BUILD dosyası şöyle görünür:

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"],
)

Burada sandwich kitaplığı şuna göre bread kitaplığına bağlıdır: (flour kitaplığında)

Dahil etme yolları

Bazen, çalışma alanındaki yollar için root işlemi yapamazsınız (veya bunu yapmak istemezsiniz) kök. Mevcut kitaplıklarda, çalışma alanınızdaki yolla eşleşmelidir. Örneğin, aşağıdaki gibi olduğunu varsayalım: dizin yapısı:

└── my-project
    ├── legacy
       └── some_lib
           ├── BUILD
           ├── include
              └── some_lib.h
           └── some_lib.cc
    └── MODULE.bazel

Bazel, some_lib.h öğesinin legacy/some_lib/include/some_lib.h, ancak diyelim ki some_lib.cc "some_lib.h". Bu dahil etme yolunu geçerli kılmak için legacy/some_lib/BUILD öğesinin, some_lib/include dizin, bir "dahil etme" dizinidir:

cc_library(
    name = "some_lib",
    srcs = ["some_lib.cc"],
    hdrs = ["include/some_lib.h"],
    copts = ["-Ilegacy/some_lib/include"],
)

Bu, özellikle başlık dosyaları gibi harici bağımlılıklar için yararlıdır. aksi takdirde / önekiyle eklenmelidir.

Harici kitaplıkları dahil et

Google Test'i kullandığınızı varsayalım. {: .external}. MODULE.bazel dosyasında buna bir bağımlılık ekleyebilirsiniz. Google Test'i indirin ve deponuzda kullanılabilir hale getirin:

bazel_dep(name = "googletest", version = "1.15.2")

C++ testleri yazma ve çalıştırma

Örneğin, aşağıdaki gibi bir test ./test/hello-test.cc oluşturabilirsiniz:

#include "gtest/gtest.h"
#include "main/hello-greet.h"

TEST(HelloTest, GetGreet) {
  EXPECT_EQ(get_greet("Bazel"), "Hello Bazel");
}

Ardından testleriniz için ./test/BUILD dosyası oluşturun:

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 öğesinin hello-test tarafından görülebilmesi için şunu eklemeniz gerekir: ./main/BUILD öğesindeki visibility özelliğine "//test:__pkg__",.

Artık testi çalıştırmak için bazel test kullanabilirsiniz.

bazel test test:hello-test

Bu işlem şu çıkışı üretir:

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.

Önceden derlenmiş kitaplıklara bağımlılık ekleme

Sadece derlenmiş sürümüne sahip olduğunuz bir kitaplığı kullanmak istiyorsanız ( örnek, başlıklar ve bir .so dosyası) bir cc_library kuralına sarmalayın:

cc_library(
    name = "mylib",
    srcs = ["mylib.so"],
    hdrs = ["mylib.h"],
)

Bu şekilde, çalışma alanınızdaki diğer C++ hedefleri bu kurala bağlı olabilir.