如何根据预处理器定义的宏关闭C ++库的子模块

时间:2017-07-11 15:02:11

标签: c++ cmake macros c-preprocessor

我正在做什么我正在编写一个依赖NetCDF库的C ++库。例如,

include <netcdf>
class myLib {
    public:

        myLib();
        myLib(const myLib&);
        virtual ~myLib();

        std::string probe_data(std::string & file_path);
        ...

函数probe_data使用NetCDF库中的函数。

有什么问题我已经定义了预处理器宏CANALOGSIO_WITHOUT_NETCDF。因为在某些系统中,没有安装NetCDF库。所以我想在我的库中关闭这个功能,例如,库仍然会有probe_data函数,但它只返回NetCDF not installed

这样做的好习惯是什么?谢谢!

1 个答案:

答案 0 :(得分:0)

我将列出两种不同的方法,我想到这一点。

1,只需在函数定义中使用ifdefs即可。这将保持统一的界面,每个人都可以调用它。

class myLib {

    ...
    std::string probe_data(std::string & file_path) {
       #ifdef NETCDF
         return do_real_probe(file_pat);
       #else
         cerr << "NOt implemented function" << endl;
         return "";
       #endif
     }

    ...

这需要对单独的系统进行单独编译。你需要在编译命令行提供宏的定义,即用gcc:

g++ -DNETCDF ..
  1. 第二种方法将基于库方法。您可以为不同的系统编译单独的实现库。然后在链接时,您可以选择使用哪个静态库(或在运行时选择动态库)。很可能你只会提供在目标系统上工作的库,什么都不会。如果您选择这样,您可能会在没有#ifdef的情况下离开,只需在不同的文件中使用不同的实现&gt;
  2. sys1.cpp

     string probe(string &) { return do_probe();}
     gcc sys1.cpp -o sys1.so -shared
    

    sys2.cpp

     string probe(string &) {cerr << messate; return "";}
     gcc sys2.cpp -o sys2.so -shared
    

    现在您只需要将正确的库(sys1或sys2)传送到正确的系统。或者是程序的正确静态链接图像。

    使用条件编译有多种方法可以做到这一点。所以你决定。