如何为cc_library添加默认的 copts,例如 '-fopenmp'?

How can i add default copts like '-fopenmp' for the cc_library?

本文关键字:例如 -fopenmp copts cc library 默认 添加      更新时间:2023-10-16

https://docs.bazel.build/versions/master/be/c-cpp.html

关于科普特选项:

此属性中的每个字符串在编译二进制目标之前按给定顺序添加到 COPTS。这些标志仅在编译此目标时生效,而不是其依赖项,因此请注意包含在其他地方的头文件。所有路径都应相对于工作区,而不是相对于当前包。

cc_library(
    name = 'lib1',
    srcs = glob([
        'src/*.cpp',
    ]),
    hdrs = glob([
        'include/*.h',
        'include/**/*.h',
    ]),
    copts = [ 
        '-std=c++11',
        '-fopenmp',
        '-march=native',
    ],
)
cc_binary(
    name = "test1",
    srcs = ["tests/test1.cpp"],
    deps = [
        ":lib1",
    ],
    copts = [ 
        '-std=c++11',
        '-fopenmp',
        '-march=native',
    ],
)

如果我删除 test1 规则中的 copts,编译将失败。如何修改lib1规则,使所有依赖它的规则也可以编译。

您还需要将linkopts = ["-lgomp"]添加到cc_binary规则中。

如果编译时每个目标都需要-std=c++ -fopenmp -march=native,最好在 build 命令 ( bazel build --copt="-std=c++" --copt="-fopenmp" --copt="-march=native" //src:hello ) 中指定 copts。然后,您可以删除cc_*规则中的copts

另请注意,如果要在一个文件中使用 -march=native,最好始终确保所有其他文件也使用此标志进行编译,以避免编译器优化可能导致的一些错误。

对我来说,解决方案是将--linkopt='-lgomp'添加到我的.bazelrc文件中。为了完整起见,.bazelrc确切地说是:build --cxxopt='-std=c++17' --cxxopt='-Ofast' --cxxopt='-fopenmp' --linkopt='-lgomp'

巴泽尔版本bazel 3.7.0 .

由于我无法评论@Cheng Ji 的答案,我只想强调他的回答对我有很大帮助,但起初通过在cc_binary中添加linkops = ["-lgomp"]不起作用(它抱怨no such attribute 'linkops' in 'cc_binary' rule)。然后我发现linkops是一个错字,所以我尝试了linkopts = ["-lgomp"],它也起作用了!非常感谢!

相关文章: