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

. Sorun bildirin 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
    └── WORKSPACE

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 ekleme

Google Test'i kullandığınızı varsayalım. WORKSPACE dosyasındaki depo işlevlerinden birini kullanarak şu işlemleri yapabilirsiniz: Google Test'i indirin ve deponuzda kullanılabilir hale getirin:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "gtest",
    url = "https://github.com/google/googletest/archive/release-1.10.0.zip",
    sha256 = "94c634d499558a76fa649edb13721dce6e98fb1e7018dfaeba3cd7a083945e91",
    build_file = "@//:gtest.BUILD",
)

Ardından, Google Test'i derlemek için kullanılan BUILD dosyasını gtest.BUILD oluşturun. Google Test'in bazı "özel" yaklaşımları var cc_library kuralını oluşturan şartlar daha karmaşıktır:

  • Diğer tüm googletest-release-1.10.0/src/gtest-all.cc #include googletest-release-1.10.0/src/ içindeki dosyalar: bu dosyayı yinelenen simgeler için bağlantı hatalarını önlemek üzere derleyin.

  • Bu özellik, googletest-release-1.10.0/include/ dizininde ("gtest/gtest.h"), bu nedenle dizini ekleme yollarına ekleyin.

  • pthread içinde bağlanması gerekiyor. Bunu linkopt olarak ekleyin.

Dolayısıyla son kural şu şekilde görünür:

cc_library(
    name = "main",
    srcs = glob(
        ["googletest-release-1.10.0/src/*.cc"],
        exclude = ["googletest-release-1.10.0/src/gtest-all.cc"]
    ),
    hdrs = glob([
        "googletest-release-1.10.0/include/**/*.h",
        "googletest-release-1.10.0/src/*.h"
    ]),
    copts = [
        "-Iexternal/gtest/googletest-release-1.10.0/include",
        "-Iexternal/gtest/googletest-release-1.10.0"
    ],
    linkopts = ["-pthread"],
    visibility = ["//visibility:public"],
)

Bu, biraz karmaşık: Her şeyin önünde googletest-release-1.10.0 var kullanıma sunulmasından ibaret değildir. http_archive şeridi oluşturabilirsiniz strip_prefix özelliğini ekleyerek bu ön eki kullanabilirsiniz:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "gtest",
    url = "https://github.com/google/googletest/archive/release-1.10.0.zip",
    sha256 = "94c634d499558a76fa649edb13721dce6e98fb1e7018dfaeba3cd7a083945e91",
    build_file = "@//:gtest.BUILD",
    strip_prefix = "googletest-release-1.10.0",
)

Bu durumda gtest.BUILD şöyle görünür:

cc_library(
    name = "main",
    srcs = glob(
        ["src/*.cc"],
        exclude = ["src/gtest-all.cc"]
    ),
    hdrs = glob([
        "include/**/*.h",
        "src/*.h"
    ]),
    copts = ["-Iexternal/gtest/include"],
    linkopts = ["-pthread"],
    visibility = ["//visibility:public"],
)

Artık cc_ kuralları @gtest//:main kaynağına bağlı olabilir.

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/include"],
    deps = [
        "@gtest//: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.