【问题标题】:Bazel: defines in a header-only libraryBazel:在仅标头库中定义
【发布时间】:2020-08-24 16:50:39
【问题描述】:

如果我有一个像这样的纯标题库(在我的例子中是 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"
    ],
)

是否观察到了定义,还是我必须手动将这些定义添加到每个依赖库中?

另外,假设我的项目中有两个依赖于 Eigen 的库,我想用 AVX512 编译一个,另一个不编译。如何隐藏各自编译的特征符号,使其不会重复使用不同定义编译的特征符号?

【问题讨论】:

    标签: bazel


    【解决方案1】:

    依赖于eigen 的目标也将继承定义(例如EIGEN_MPL_ONLY)。

    详情见here:

    每个字符串,...,是 前面加上 -D 并添加到编译命令行中 目标,以及依赖于它的每个规则

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

    WORKSPACE.bazel

    # Empty
    

    ma​​in/BUILD.bazel

    cc_binary(
        name = "main",
        srcs = ["main.cpp"],
        deps = ["//my_header_only_lib:my_header_only_lib"]
    )
    

    ma​​in/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/BUILD.bazel

    package(
        default_visibility = ["//visibility:public"],
    )
    
    cc_library(
        name = "my_header_only_lib",
        hdrs = ["header.h"],
        includes=["."],
        defines = ["FOO_BAR"],
    )
    

    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
        }
    };
    

    输出

    FOO_BAR defined
    FOO_BAR is also known in main
    

    【讨论】:

    • 即使 eigen 本身没有 srcs?
    • @user1282931 收集所有定义并交给编译器
    猜你喜欢
    • 2012-01-02
    • 2011-04-27
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多