使用rules_foreign_cc时cmake目标无法找到依赖的configure_make编译的libpcap
解决方案
你遇到的问题是rules_foreign_cc不会自动将依赖的头文件、库路径注入到下游CMake的查找逻辑中,需要手动指定FindPCAP模块的查找参数。
修改BUILD配置如下
load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake", "configure_make") configure_make( name = "libpcap", lib_source = "@libpcap//:all_srcs", out_libs = ["libpcap.a"], visibility = ["//visibility:public"], ) cmake( name = "libtins", lib_source = "@libtins//:all_srcs", deps = [":libpcap"], cache_entries = { # DEP_<依赖名大写>_PREFIX是rules_foreign_cc自动注入的变量,指向依赖的安装根目录 "PCAP_INCLUDE_DIR": "${DEP_LIBPCAP_PREFIX}/include", "PCAP_LIBRARY": "${DEP_LIBPCAP_PREFIX}/lib/libpcap.a", }, )
配置说明
- rules_foreign_cc对每个声明在
deps中的依赖,会自动注入格式为DEP_<依赖名大写>_PREFIX的环境变量,指向该依赖构建完成后的安装根目录,目录下会有标准的include头文件目录和lib库文件目录 - 这里通过
cache_entries参数将路径直接传递给CMake的FindPCAP模块对应的变量,跳过系统路径查找逻辑,直接使用你本地编译的libpcap
异常排查
如果还是出现找不到的错误,可按以下方向调整:
- 若需要链接动态库,给
configure_make添加配置项configure_options = ["--enable-shared=yes"],同时将PCAP_LIBRARY的后缀改为对应平台的动态库后缀(Linux为.so,macOS为.dylib) - 部分特殊平台下libpcap编译产出的库名可能不同,可先单独编译libpcap目标,查看输出目录下的库文件名,替换
PCAP_LIBRARY中的文件名即可
内容的提问来源于stack exchange,提问作者susdu
相关产品推荐
相关产品推荐

