我想编写并编译一个外部库的包装器,以创建一个围绕依赖项的抽象(并使其更容易,例如将其切换为具有类似功能的另一个)。为此,我有一个类似于以下内容的源代码树:
src
- libraryWrapper
- wrapper.cpp/hpp
- runner.cpp/hpp
wrapper.cpp/hpp
是包装文件。基本上,它们定义了一个类,它从库中封装了一个类的实例,并公开了我自己的接口版本(相关部分)。基本上类似于以下内容:
// wrapper.hpp
#include <externalLibrary>
class MyWrapper {
private:
LibraryClass _libclass;
public:
MyWrapper();
double caluclateSomething(double,double);
double
};
// wrapper.cpp
#include "wrapper.hpp"
MyWrapper::MyWrapper() : _libclass() { };
double MyWrapper::calculateSometing(double a, double b) {
return _libclass.doCalculationOfStuff(a, b, 14 /* param I don't expose */);
};
我使用CMake / Make构建它,使用类似于this的方法从子目录(包装器)构建库并在主程序(runner)中链接到它。但是,由于runner.cpp
需要了解MyWrapper
类,因此需要包含wrapper.hpp
。当我这样做时,编译失败并出现错误
在/path/to/runner.cpp:8:0中包含的文件中:致命错误:没有这样的文件或目录
#include <externalLibrary> ^
所以看来我必须将外部库的include目录添加到include目录列表中,以便编译 runner 类。但是为了完全抽象出外部库的选择,我不希望运行器类 - 或者它旁边的CMakeFile.txt
根本不知道库。
这可能吗?实现它的最佳方法是什么? (如果我这样做的方式很糟糕,那么更好的方法是做什么?)