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

标签 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

这样做的好做法是什么?谢谢!

最佳答案

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

1、在函数定义中使用ifdefs即可。这将保持统一的接口(interface),每个人都可以调用它。

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. 第二种方法将基于图书馆方法。您可以为不同的系统编译单独的实现库。然后在链接时,您可以选择要使用的静态库(或在运行时选择动态库)。很可能你只会交付在目标系统上工作的库,什么都不会。如果你选择的话,你可能不用 #ifdefs 就可以逃脱,只是在不同的文件中有不同的实现>

系统1.cpp

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

系统2.cpp

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

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

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

关于c++ - 如何根据预处理器定义的宏关闭 C++ 库的子模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45038192/

相关文章:

android - QML导入错误

c++ - 如何使用 auto_ptr 作为处理另一个成员变量的成员变量

python - CMake 有没有办法利用 `swig -MM` 生成的依赖项?

macros - 为什么此宏会导致未解析的名称错误?

ios - #define 在 Objective-C 的头文件中

c++ - 函数 getValue(s) cplex c++ 的问题

c++ - 我需要在 Win32 示例中使用虚拟内存

cmake - include_directories 和 interface_include_directories 之间有什么区别,只有头文件库

cmake - CMake为静态库生成-L <path> -l <​​lib>链接标志

c - 如何获取OPENSSL中MACRO生成的函数的地址