Bazel:仅在标题库中定义
如果我有一个只有标题的库(在我的例子中是Eigen),如下所示:Bazel:仅在标题库中定义,bazel,Bazel,如果我有一个只有标题的库(在我的例子中是Eigen),如下所示: cc_library( name = "eigen", hdrs = glob( ["Eigen/**"], exclude = [ "Eigen/src/OrderingMethods/Amd.h", "Eigen/src/SparseCholesky/**&quo
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所有定义都被收集并移交给编译器