Linux 下编译动态链接库,并应用
1、so文件的编译
so文件的编译不需要main函数,编译命令:
g++ -fPIC -shared -o ***.so ***.cpp
2、链接库头文件中函数定义使用虚函数
virtual告诉编译器不要静态链接到该函数,做为基类函数定义使用。
3、子类调用动态链接库时
子类文件包含基类的头文件,继承基类;重新实现基类的虚函数,实现数据分发重新处理。
4、从期货交易sdk 风控api的一些思考
· 现象:无论是否订阅所以的数据接口,对于网络带宽的占用都是一样的,且只有一个tcp连接
· 原因:风控ctp通过RiskApi 会把所有的数据流都推送的下游,是否进行数据的处理只在于子类对于基类的虚函数的实现。
·扩展:a.根据此种方法可以进行数据中转服务的开发;2、可以根据将订阅函数中进行tcp通信工作,从tcpServer端进行数据接口的过滤,这样可以有效缩减传输数据量。
例子:
1、链接库
编译:g++ -fPIC -shared -o libmax.so max.cpp
max.h
#pragma once
#include <iostream>
class max
{
public:
max() {
flag=false;
}
~max() {}
virtual int GetMax(int a, int b);
virtual int GetMin(int a, int b);
virtual void SetFlag(bool flag);
virtual void GenerateNum(int num);
virtual void ShowJi(int* pnum);
virtual void ShowOu(int* pnum);
bool flag;
private:
};
max.cpp
#include "max.h"
int max::GetMax(int a, int b)
{
int n = a>b?a:b;
std::cout << "max:"<<n << std::endl;
return n;
}
int max::GetMin(int a, int b)
{
int n = a<b?a:b;
std::cout<<"min:"<<n<<std::endl;
return n;
}
void max::SetFlag(bool flag)
{
this->flag = flag;
}
void max::GenerateNum(int num)
{
for(int i= 0; i<num; i++)
{
if(i%2==0 && flag)
{
ShowOu(&i);
}
else
{
ShowJi(&i);
}
}
std::cout<<"Generate over!"<<std::endl;
}
void max::ShowJi(int* pnum){}
void max::ShowOu(int* pnum){}
2、so应用
编译:g++ -o maxmain main.cpp libmax.so
main.cpp
#include <iostream>
#include "max.h"
class mytest:public max
{
public:
void ShowJi(int *pnum)
{
std::cout<<"show Ji:"<<*pnum<<std::endl;
}
void ShowOu(int *pnum)
{
std::cout<<"show Ou:"<<*pnum<<std::endl;
}
};
int main()
{
mytest m;
m.GetMax(123, 234);
m.GetMin(123, 234);
m.SetFlag(true);
m.GenerateNum(100);
std::cout << "Hello world" << std::endl;
return 0;
}