编译C ++库包装器,并在没有库头的情况下包含它

时间:2014-02-20 17:36:56

标签: c++ shared-libraries header-files abstraction

我想编写并编译一个外部库的包装器,以创建一个围绕依赖项的抽象(并使其更容易,例如将其切换为具有类似功能的另一个)。为此,我有一个类似于以下内容的源代码树:

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根本不知道库。

这可能吗?实现它的最佳方法是什么? (如果我这样做的方式很糟糕,那么更好的方法是做什么?)

0 个答案:

没有答案