main代码如下:
#include "B.h"
#include
using namespace std;
int main (int argc, char *argv[])
{
B objB;
int result = objB.func(1, 2);
cout << "result = " << result << endl;
}
libA代码如下:
/**
*********A.cpp************
*/
#include "A.h"
#include
using namespace std;
A::A()
{
cout << "A ctor" << endl;
}
A::~A()
{
cout << "A dtor" << endl;
}
int A::func(int x, int y)
{
return (x + y) * 2;
}
/**
*********A.h************
*/
#ifndef _A_H_
#define _A_H_
#include "ADll.h"
class LIBA_API A {
public:
A();
~A();
int func(int x, int y);
};
#endif
libB代码如下:
/**
*******************B.cpp********************
*/
#include "B.h"
#include "A.h"
#include
using namespace std;
class BImpl {
public:
BImpl() {};
~BImpl() {};
int func(int x, int y){
return objA.func(x, y);
}
private:
A objA;
};
B::B() : _impl(new BImpl)
{
cout << "B ctor" << endl;
}
B::~B()
{
cout << "B dtor" << endl;
delete _impl;
}
int B::func(int x, int y){
return _impl->func(x, y);
}
/**
************B.h*******************
*/
#ifndef _B_H_
#define _B_H_
#include "BDll.h"
class BImpl;
class LIBB_API B {
public:
B();
~B();
int func(int x, int y);
private:
BImpl *_impl;
};
#endif
以libA下的makefile为例学习makefile:
CXX= g++ #编译器
AR= ar # 对.o文件进行归档,生成库
CXXFLAGS = -shared -g -Wall -fPIC -std=c++11 -I./ #g++参数:-shared 调用动态库 -g 可执行程序包含调试信息 -Wall 编译后显示所有警告 -fPIC 真正的共享.so -std=c++11 支持c++11标准; -I 后跟头文件地址
LDFLAGS = -L./ # 库文件地址 ### -Wl,-rpath=your_lib_dir 只有-L选项时有可能编译通过但是执行时not found 库,因为-L只有编译时有效,可以通过加上此命令记住链接库的位置;
SRCS = $(wildcard *.cpp) # wildcard 函数,展开所有的.cpp文件
OBJS = $(patsubst %.cpp, %.o, $(SRCS)) patsubst函数 将.cpp全部替换成.o并返回,等于objs等于.cpp编译的.o文件
$(info SRCS = $(SRCS))
$(info OBJS = $(OBJS)) # info make的打印函数
TARGET= libA.so libA.a # 编译目标
OUTPUT= ../output #输出位置
all: clean $(TARGET) install copy2B # 让所有的操作顺次执行,
.PHONY: clean install copy2B #因为make的规则是 目标 :依赖 ,当 main : main.c 时,为了从依赖获取目标,就会执行之后的规则;
#但是当clean:后没有依赖时,make会认为依旧获取到目标,因此不再执行clean后的规则,
#用.PHONY关键字,意为欺骗make,clean目标还未达成,即会执行clean之后的规则;
# 目标 : 依赖
# 规则
.cpp.o: #自动将.cpp识别为源文件后缀,.o识别为目标文件后缀; g++ -c 将.cpp编译成.o ,而不是可执行
@echo "\ncompile..."
$(CXX) -c $< -o $@ -DLIBA_API_EXPORTS $(CXXFLAGS) # $@目标文件 $^所有的依赖文件 $
$(TARGET): $(OBJS) # .o到.so .a
$(CXX) $^ -o $@ $(CXXFLAGS) $(LDFLAGS) #g++生成动态库 gcc -fPIC -shard -o 目标 源文件 gcc -c -fPIC *.c gcc -shared -o *.so *.o
$(AR) -crsv libA.a $^ # ar 创建静态库 -c 禁止再创建库的文件时产生的正常信息 -r 如果已存在,则替换 -s 无论是否修改了库的内容,强制生成库符号表 其余命令可查找学习
install:
@echo "\ninstall to output..."
cp A.h ADll.h $(OUTPUT)/include # cp 移动
cp -a $(TARGET) ${OUTPUT}/lib/linux
clean:
@echo "\nclean..."
rm -rf $(TARGET) *.o #清除中间文件
copy2B:
@echo "\ncopy to libB..."
cp ../output/include/*../../libB/include
cp ../output/lib/linux/*../../libB/lib/linux
现在已经学会了简单的makefile文件编写,接下来就可以进行实践尝试了;