• blade-build如何创建和使用动态库(.so)


    基础

    • 动态库so和静态库a的原理,参考文档文件组织原则
      • gcc:
        • -L.表示gcc编译时候找so的目录
        • -ltest表示gcc编译的时候找库的规则
        • -shared:生成so
        • -fPIC:编译位置独立的目标
        • LD_LIBRARY_PATH:运行时找so的路径(感觉和编译时的-L.很像)
        • -static:生成静态库
      • ldd:可以对目标依赖哪些so进行查看
      • nm:符号查看工具,对目标中的符号进行解析;T表示在目标中定义的,U表示目标依赖的,W是弱依赖,可能被别的目标符号给覆盖
      • ar:ar -t libxxxx.a看静态库有哪些.o构成;ar -q libxxxx.a 1.o 2.o 3.o …将x.o构成libxxxx.a
      • ld:将目标(.o、.a)链接成bin或者.a
    • 构建C++库时,BUILD的写法,参考官方文档。
      • 生成so需要依赖它的cc_plugin,让别的bin可以去依赖;需要设置link_all_symbols = True,(不管用不用函数都链接到so里)dynamic_link = True,(生成so,或者blade build的时候设置–generate-dynamic参数)
      • bin依赖so时,需要将生成的so当做一个本地的库去依赖,并设置prebuilt = True, 和incs 参数
    生成so

    BUILD:

    cc_plugin(
      name = 'say',
      srcs = ['say.cpp',],
      link_all_symbols = True,
      dynamic_link = True,
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    say.h

    #pragma once
    #include
    void Say(const std::string& s);
    
    • 1
    • 2
    • 3

    say.cpp:

    #include "say.h"
    #include
    void Say(const std::string& s) {
      std::cout<< "hello " << s << std::endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    编译:

    blade build --generate-dynamic
    
    • 1
    使用so

    BUILD:
    需要手动将.h放到include目录中,可以通过shell自动化完成

    cc_binary(
      name = 'main',
      srcs = ['main.cpp',],
      deps = [
          ':say',
      ],
      dynamic_link = True,
    )
    
    
    cc_library(
      name = 'say',
      incs = ['include'],
      prebuilt = True,
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    main.cpp
    需要将生成的so放到新创建的lib64_release目录里

    #include "include/say.h"
    #include 
    #include 
    #include
    
    using namespace std;
    
    int main() {
      cout << "helll" << endl;
      Say("你好");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    build:

    function execshell()
    {
        echo "[execshell]$@ begin."
        eval $@
        [[ $? != 0 ]] && {
            echo "[execshell]$@ failed."
            exit 1
        }
        echo "[execshell]$@ success."
        return 0
    }
    execshell "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUR_PATH/lib64_release"
    blade build --generate-dynamic
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    运行

    将blade-bin中的main拷贝出来,让bin可以链接到so才可以运行:

  • 相关阅读:
    Python查验身份证
    【机器学习并行计算】2 parameter server参数服务器
    不使用canvas怎么实现一个刮刮卡效果?
    jvm 堆内存 栈内存 大小设置
    C++学习之旅
    Vue - 动态改变元素容器(非页面body)滚动条位置(设置指定子元素div的滚动条位置)
    《向量数据库指南》为什么要研发 Milvus Cloud?
    vue属性data的处理规则
    ocr、人工智能、文字识别接口
    985测试工程师被吊打,学历和经验到底谁更重要?
  • 原文地址:https://blog.csdn.net/u014257954/article/details/127837808