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,
)

say.h

#pragma once
#include<string>
void Say(const std::string& s);

say.cpp:

#include "say.h"
#include<iostream>
void Say(const std::string& s) {
  std::cout<< "hello " << s << std::endl;
}

编译:

blade build --generate-dynamic
使用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,
)

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

#include "include/say.h"
#include <string>
#include <iostream>
#include<vector>

using namespace std;

int main() {
  cout << "helll" << endl;
  Say("你好");
}

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
运行

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值