代码之家  ›  专栏  ›  技术社区  ›  Wade

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

  •  1
  • Wade  · 技术社区  · 7 年前

    我在做什么 NetCDF 图书馆例如

    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 因为在某些系统中 probe_数据 函数,但它只是返回 NetCDF not installed .

    1 回复  |  直到 7 年前
        1
  •  0
  •   Serge    7 年前

    我将列出我想到的两种不同的方法。

    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,您可能不需要它,只需在不同的文件中使用不同的实现即可>

    sys1.cpp

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

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

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