基础
- 动态库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
- gcc:
- 构建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才可以运行: