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
void Say(const std::string& s);

say.cpp:

#include "say.h"
#include
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 
#include 
#include

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才可以运行:

你可能感兴趣的:(C/C++,c++)