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

本文详细介绍了C++中动态库SO和静态库A的生成原理,包括gcc编译选项如-shared、-fPIC以及-L、-l的使用。还探讨了ldd、nm、ar等工具在库管理中的作用。通过示例展示了BUILD文件配置动态库和静态库的方法,并讲解了如何在不同项目中依赖这些库。最后,讨论了运行时动态链接库的路径设置和bin文件的部署策略。
摘要由CSDN通过智能技术生成

基础

  • 动态库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才可以运行:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值