首页 > 编程语言 >百度 Apollo 使用 bazel 编译 C++ Boost 依赖出现 undefined reference to `boost::python::api::object::object(boos

百度 Apollo 使用 bazel 编译 C++ Boost 依赖出现 undefined reference to `boost::python::api::object::object(boos

时间:2024-05-19 13:00:53浏览次数:32  
标签:lboost undefined reference python cc main boost hello

CSDN搬家失败,手动导出markdown后再导入博客园

因为一些原因,楼主想在 Apollo 自动驾驶框架里使用 Boost.python 工具来用 C++ 调用 Python,从网上找了个例子想编译下试试。

C++ 代码如下(boost.python/EmbeddingPython - Python Wiki):

#include <boost/python.hpp>
 
 
using namespace boost::python;
 
int main( int argc, char ** argv ) {
  try {
    Py_Initialize();
 
    object main_module((
      handle<>(borrowed(PyImport_AddModule("__main__")))));
 
    object main_namespace = main_module.attr("__dict__");
 
    handle<> ignored(( PyRun_String( "print (\"Hello, World\")",
                                     Py_file_input,
                                     main_namespace.ptr(),
                                     main_namespace.ptr() ) ));
  } catch( error_already_set ) {
    PyErr_Print();
  }
}

BUILD 文件如下:

cc_binary(
    name = "hello",
    srcs = [
        "hello.cc",
    ],
    deps = [
        #"@local_config_python//:python_headers",
        #"@local_config_python//:python_lib",
        "@boost",
    ],
)

一开始没有引入 local_config_python 的两个依赖,导致出现

(01:50:17) ERROR: /apollo/modules/zj_prediction/BUILD:52:10: Linking of rule '//modules/zj_prediction:hello' failed (Exit 1): crosstool_wrapper_driver_is_not_gcc failed: error executing command external/local_config_cuda/crosstool/clang/bin/crosstool_wrapper_driver_is_not_gcc @bazel-out/k8-opt/bin/modules/zj_prediction/hello-2.params
bazel-out/k8-opt/bin/modules/zj_prediction/_objs/hello/hello.o: In function `main':
hello.cc:(.text.startup.main+0x3c): undefined reference to `boost::python::api::object::object(boost::python::handle<_object> const&)'
hello.cc:(.text.startup.main+0x75): undefined reference to `boost::python::api::getattr(boost::python::api::object const&, char const*)'
hello.cc:(.text.startup.main+0xe8): undefined reference to `boost::python::throw_error_already_set()'
hello.cc:(.text.startup.main+0xf2): undefined reference to `boost::python::throw_error_already_set()'
hello.cc:(.text.startup.main+0x126): undefined reference to `vtable for boost::python::error_already_set'
hello.cc:(.text.startup.main+0x141): undefined reference to `boost::python::error_already_set::~error_already_set()'
hello.cc:(.text.startup.main+0x15f): undefined reference to `boost::python::error_already_set::~error_already_set()'
bazel-out/k8-opt/bin/modules/zj_prediction/_objs/hello/hello.o:(.data.rel.local.DW.ref._ZTIN5boost6python17error_already_setE[DW.ref._ZTIN5boost6python17error_already_setE]+0x0): undefined reference to `typeinfo for boost::python::error_already_set'
collect2: error: ld returned 1 exit status

去掉注释后就好了。

然后使用 bazel 编译这个模块时出现了报错信息

load("@rules_cc//cc:defs.bzl", "cc_library")
 
licenses(["notice"])
 
package(default_visibility = ["//visibility:public"])
 
# TODO(all): May use rules_boost.
cc_library(
    name = "boost",
    includes = ["."],
    linkopts = [
        "-L/opt/apollo/sysroot/lib",
        "-lboost_filesystem",
        "-lboost_program_options",
        "-lboost_regex",
        "-lboost_system",
        "-lboost_thread",
        # "-lboost_python36",        一开始没有
    ],
)

看报错信息大概意思是 boost 找不到包里的 Python 库,为此上网找了一下午都没解决,后来突然发现是因为楼主的环境配置跟别人不一样,lib 的名字不同当然不能直接复制解决了,下面说一下解决思路。

主要参考的是 Add boost library as Bazel dependency c++ - Stack Overflow

Since you're linking your executable to Boost Python/Numpy, you also need to provide Python symbols.

If you don't need Python, the easiest solution is add libboost_numpy.so to exclude in your glob. If you actually need Python, a quick fix would be to add -lpython to linkopts in BOOST.build (this is not a solution that I would recommend for production, since you have no control over Python versions, etc..)

里面提到要在 BOOST.build里面加入-lpython,

还有對 boost::python::detail::init_module 和 friend 的 undefined reference - C++ _程式人

我添加了兩個額外的標誌來增強效果,然後就可以了!

-lboost_python -lboost_system

里面提到加入的是 - lboost_python,我两种都试了一下发现不行,于是开始思考人生。

先看下我的 boost.BUILD 文件是什么样的:

load("@rules_cc//cc:defs.bzl", "cc_library")
 
licenses(["notice"])
 
package(default_visibility = ["//visibility:public"])
 
# TODO(all): May use rules_boost.
cc_library(
    name = "boost",
    includes = ["."],
    linkopts = [
        "-L/opt/apollo/sysroot/lib",
        "-lboost_filesystem",
        "-lboost_program_options",
        "-lboost_regex",
        "-lboost_system",
        "-lboost_thread",
        # "-lboost_python36",        一开始没有
    ],
)

直接在 linkopts 里面加上这两种 - l 都没用,于是急需谷歌搜 bazel cannot find -lboost_python,然后出现这一条:

https://stackoverflow.com/questions/65675412/bazel-build-cannot-find-shared-library​​​​​​,里面提到了-L/usr/local/lib

Bazel likes to use the gold linker instead of GNU ld by default. gold, unlike GNU ld, doesn't put /usr/local/lib on the default library search path. This can be remediated by passing --linkopt=-L/usr/local/lib to Bazel.

然后猛然发现自己的 boost.BUILD 文件里面有一行 "-L/opt/apollo/sysroot/lib", 这明显是跟上面提到的-L/usr/local/lib 起相同的作用,于是

ll /opt/apollo/sysroot/lib/

发现下面有很多 libboost***,然后果然找到了一个

/opt/apollo/sysroot/lib/libboost_python36.so -> libboost_python36.so.1.74.0*

所以合理猜测在我的环境里,并不是 -lboost_python,而应该是 -lboost_python36!!!

在 boost.BUILD 文件里加入这行后,顺利编译成功,实现了 C++ 调用 Python 输出

Hello, World

标签:lboost,undefined,reference,python,cc,main,boost,hello
From: https://www.cnblogs.com/algorithmSpace/p/18200242

相关文章

  • 如何解决`Dereference of a possibly null reference.CS8602`
    如何解决Dereferenceofapossiblynullreference.CS8602Q1stringvalue=property.GetValue(obj).ToString().Trim();上面的代码,报错如下:Dereferenceofapossiblynullreference.CS8602Dereferenceofapossiblynullreference.CS8602A1这个错误提示是C##8.0......
  • 梯度提升Gradient Boosting
    总览GradientBoosting梯度提升,是一种强大的ML技术,用于回归和分类问题。弱学习算法通常更易发现、更易训练。Boosting系列算法的基本思想是将弱基础模型组合为一个强大的集成。GradientBoosting的基本思想是:不断重复生成弱学习器,每次生成弱学习器的目标是拟合先前累加模......
  • 数据分享|python分类预测职员离职:逻辑回归、梯度提升、随机森林、XGB、CatBoost、LGB
    全文链接:https://tecdat.cn/?p=34434原文出处:拓端数据部落公众号分析师:ShilinChen离职率是企业保留人才能力的体现。分析预测职员是否有离职趋向有利于企业的人才管理,提升组织职员的心理健康,从而更有利于企业未来的发展。解决方案任务/目标采用分类这一方法构建6种模型对职......
  • 探讨:ARC(Automatic Reference Counting)与手动内存管理的区别及工作原理
    在iOS和macOS开发中,内存管理是一个至关重要的话题。在过去,手动内存管理是一项繁琐且容易出错的任务,而引入了ARC(AutomaticReferenceCounting,自动引用计数)之后,内存管理变得更加简单和安全。本文将详细讨论ARC和手动内存管理之间的区别,并解释ARC的工作原理。1.ARC与手......
  • qt 使用windows 的USB库 hid.dll 报错 :undefined reference to `HidD_GetAttributes(v
     1、cmakeLists.txt文件引入相应的库: cmake_minimum_required(VERSION3.5)project(test1LANGUAGESCXX)file(GLOBSRC./*.cpp./*.h)add_executable(test1${SRC})include(GNUInstallDirs)target_link_libraries(${PROJECT_NAME}hidsetupapi)inst......
  • TypeError: Cannot read properties of undefined (reading 'trim')
     运行时提示:TypeError:Cannotreadpropertiesofundefined(reading'trim')问题排查:1、确认trim()属性是否存在,这个是js去除字符串左右空格,属性是存在的2、确认this.form.proxy_url是否存在3、确认确认this.form.proxy_url的值是否为undefined和null通过排查和打印,con......
  • 随机森林Adaboosting算法与Python实现(二)
    AdaBoost是Freund和Schapire于1996年提出的一种集成学习方法。它的核心思想是通过迭代训练一系列弱分类器,每次调整样本权重以便更好地拟合被前一轮分类器错误分类的样本,从而构建一个强分类器。最终的模型是基于这些弱分类器的加权组合。AdaBoost广泛应用于二分类和多分类问题,尤其......
  • C++指针与引用(Pointers OR References)
    一、PointersPointer是指针,可以用来指向任何一个objects,包括一般变量:1inti=3;2int*pi=&i;3cout<<pi<<endl;//0x0064FDF04cout<<*pi<<endl;//3此时pi本身内含i的地址,要取出pi所指向的object,可以使用*运算符(dereferenceoperator).Pointer......
  • macOS OpenCV报错:Undefined symbols for architecture x86_64
    这个错误可能是链接的OpenCV库不对,我这里的情况是我代码使用的GCC编译器,但是通过brewinstallopencv安装的OpenCV是使用clang编译的,代码也使用clang编译器可以解决这个问题。要查看opencv的编译信息,可以使用这个命令opencv_version-v我这边输出Generalconfigurationfo......
  • boost的安装、查看与卸载(某动态库要求的boost版本不适配怎么办?)
    boost的安装、查看与卸载(某动态库要求的boost版本不适配怎么办?)查看版本dpkg-S/usr/include/boost/version.hpp原生安装动态库位置:Usr/local/lib/或者/usr/lib/x86_64-linux-gnu/安装boost官网下载想要的boost版本,按下述方式编译安装,不需要卸载原本的boost,注意最后.......