Bazel:仅在标题库中定义

Bazel:仅在标题库中定义,bazel,Bazel,如果我有一个只有标题的库(在我的例子中是Eigen),如下所示: cc_library( name = "eigen", hdrs = glob( ["Eigen/**"], exclude = [ "Eigen/src/OrderingMethods/Amd.h", "Eigen/src/SparseCholesky/**&quo

如果我有一个只有标题的库(在我的例子中是Eigen),如下所示:

cc_library(
    name = "eigen",
    hdrs = glob(
        ["Eigen/**"],
        exclude = [
            "Eigen/src/OrderingMethods/Amd.h",
            "Eigen/src/SparseCholesky/**",
            "Eigen/Eigen",
            "Eigen/IterativeLinearSolvers",
            "Eigen/MetisSupport",
            "Eigen/Sparse",
            "Eigen/SparseCholesky",
            "Eigen/SparseLU",
        ],
    ),
    defines = [
        "EIGEN_MPL_ONLY",
        "EIGEN_NO_DEBUG",
        "EIGEN_DONT_PARALLELIZE",
        "EIGEN_UNALIGNED_VECTORIZE=0",
        "EIGEN_MAX_ALIGN_BYTES=32",
        "EIGEN_MAX_STATIC_ALIGN_BYTES=32",
        "EIGEN_NO_AUTOMATIC_RESIZING"
    ],
)
是否观察到这些定义,或者我必须手动将这些定义添加到每个依赖库中


另外,假设我的项目中有两个库依赖于Egen,我想编译一个使用AVX512,另一个不使用。如何将各自编译的本征符号彼此隐藏,以便它不会重用使用不同定义编译的本征符号?

依赖于
本征的目标也将继承定义(例如
仅本征符号

详情请参阅:

每个字符串,…,都是 以-D开头并添加到编译命令行中 目标,以及依赖它的所有规则

A还可以设置一个小型试验台,以检查定义的工作方式:

WORKSPACE.bazel

# Empty
cc_binary(
    name = "main",
    srcs = ["main.cpp"],
    deps = ["//my_header_only_lib:my_header_only_lib"]
)
package(
    default_visibility = ["//visibility:public"],
)

cc_library(
    name = "my_header_only_lib",
    hdrs = ["header.h"],
    includes=["."],
    defines = ["FOO_BAR"],
)
main/BUILD.bazel

# Empty
cc_binary(
    name = "main",
    srcs = ["main.cpp"],
    deps = ["//my_header_only_lib:my_header_only_lib"]
)
package(
    default_visibility = ["//visibility:public"],
)

cc_library(
    name = "my_header_only_lib",
    hdrs = ["header.h"],
    includes=["."],
    defines = ["FOO_BAR"],
)
main/main.cpp

#include "header.h"
#include <iostream>

int main() {
    Vector3<float> vec;
    vec.print();

    #ifdef FOO_BAR
            std::cout << "FOO_BAR is also known in main" << std::endl;
    #endif
}
my_header_only_lib/my_header_only_lib.h

#pragma once

#include <iostream>

template<typename ScalarType>
class Vector3 {
public:
    ScalarType x, y, z;

    void print() {
        #ifdef FOO_BAR
            std::cout << "FOO_BAR defined" << std::endl;
        #endif
    }
};

依赖于
eigen
的目标也将继承定义(例如仅
eigen\u MPL\u

详情请参阅:

每个字符串,…,都是 以-D开头并添加到编译命令行中 目标,以及依赖它的所有规则

A还可以设置一个小型试验台,以检查定义的工作方式:

WORKSPACE.bazel

# Empty
cc_binary(
    name = "main",
    srcs = ["main.cpp"],
    deps = ["//my_header_only_lib:my_header_only_lib"]
)
package(
    default_visibility = ["//visibility:public"],
)

cc_library(
    name = "my_header_only_lib",
    hdrs = ["header.h"],
    includes=["."],
    defines = ["FOO_BAR"],
)
main/BUILD.bazel

# Empty
cc_binary(
    name = "main",
    srcs = ["main.cpp"],
    deps = ["//my_header_only_lib:my_header_only_lib"]
)
package(
    default_visibility = ["//visibility:public"],
)

cc_library(
    name = "my_header_only_lib",
    hdrs = ["header.h"],
    includes=["."],
    defines = ["FOO_BAR"],
)
main/main.cpp

#include "header.h"
#include <iostream>

int main() {
    Vector3<float> vec;
    vec.print();

    #ifdef FOO_BAR
            std::cout << "FOO_BAR is also known in main" << std::endl;
    #endif
}
my_header_only_lib/my_header_only_lib.h

#pragma once

#include <iostream>

template<typename ScalarType>
class Vector3 {
public:
    ScalarType x, y, z;

    void print() {
        #ifdef FOO_BAR
            std::cout << "FOO_BAR defined" << std::endl;
        #endif
    }
};

即使eigen本身没有SRC?@user1282931所有定义都被收集并移交给编译器即使eigen本身没有SRC?@user1282931所有定义都被收集并移交给编译器